Rozšíření pro iOS v Xamarin.iOS

Vytváření rozšíření ve videu pro iOS

Rozšíření představená v iOSu 8 jsou specializovaná UIViewControllers , která jsou prezentována iOSem uvnitř standardních kontextů, jako je centrum oznámení, protože vlastní typy klávesnice požadované uživatelem k provedení specializovaného vstupu nebo jiných kontextů, jako je úprava fotky, kde rozšíření může poskytovat speciální filtry efektů.

Všechna rozšíření se instalují společně s aplikací typu Container (s oběma prvky napsanými pomocí 64bitových sjednocených rozhraní API) a aktivují se z konkrétního bodu rozšíření v hostitelské aplikaci. A vzhledem k tomu, že se budou používat jako doplňky stávajících systémových funkcí, musí být vysoce výkonné, štíhlé a robustní.

Rozšiřující body

Typ Popis Bod rozšíření Hostitelská aplikace
Akce Specializovaný editor nebo prohlížeč pro konkrétní typ média com.apple.ui-services Všechny
Zprostředkovatel dokumentů Umožňuje aplikaci používat vzdálené úložiště dokumentů. com.apple.fileprovider-ui Aplikace využívající UIDocumentPickerViewController
Klávesnice Alternativní klávesnice com.apple.keyboard-service Všechny
Úpravy fotek Manipulace s fotkou a úpravy com.apple.photo-editing editor Photos.app
Sdílení Sdílí data se sociálními sítěmi, službami zasílání zpráv atd. com.apple.share-services Všechny
Dnes Widgety, které se zobrazují na obrazovce Dnes nebo v Centru oznámení com.apple.widget-extensions Dnes a Centrum oznámení

Do iOS 10 a iOS 12 byly přidány další body rozšíření. Kompletní tabulku všech podporovaných typů najdete v Průvodci programováním rozšíření aplikace pro iOS.

Omezení

Rozšíření mají řadu omezení, z nichž některé jsou univerzální pro všechny typy (například žádný typ rozšíření nemá přístup k fotoaparátům nebo mikrofonům), zatímco jiné typy rozšíření můžou mít specifická omezení jejich použití (například vlastní klávesnice se nedají použít pro zabezpečená pole pro zadávání dat, jako jsou hesla).

Univerzální omezení jsou:

Jednotlivá omezení najdete v Průvodci programováním rozšíření aplikací společnosti Apple.

Distribuce, instalace a spouštění rozšíření

Rozšíření se distribuují z aplikace kontejneru, která se následně odešle a distribuuje prostřednictvím App Storu. Rozšíření distribuovaná s aplikací jsou v tomto okamžiku nainstalovaná, ale uživatel musí každé rozšíření explicitně povolit. Různé typy rozšíření jsou povoleny různými způsoby; několik vyžaduje, aby uživatel přecháděl do aplikace Nastavení a povolil ho odsud. Zatímco ostatní jsou v okamžiku použití povoleni, například povolení rozšíření sdílení při odesílání fotky.

Aplikace, ve které se rozšíření používá (kde uživatel narazí na bod rozšíření), se označuje jako hostitelská aplikace, protože se jedná o aplikaci, která je hostitelem rozšíření při spuštění. Aplikace, která nainstaluje rozšíření, je kontejnerová aplikace, protože se jedná o aplikaci, která obsahovala rozšíření při instalaci.

Aplikace kontejneru obvykle popisuje rozšíření a provede uživatele procesem jeho povolení.

Ladění a vydávání verzí rozšíření

Limity paměti pro spouštění rozšíření aplikací jsou výrazně nižší než limity paměti použité u aplikace v popředí. Simulátory s iOSem mají méně omezení, která platí pro rozšíření, a bez jakýchkoli problémů můžete rozšíření spustit. Spuštění stejného rozšíření na zařízení ale může vést k neočekávaným výsledkům, včetně chybového ukončení rozšíření nebo agresivního ukončení systémem. Před odesláním proto nezapomeňte rozšíření sestavit a otestovat na zařízení.

Měli byste zajistit, aby se pro projekt kontejneru a všechna odkazovaná rozšíření použila následující nastavení:

  1. Sestavení balíčku aplikace v konfiguraci vydané verze
  2. V nastavení projektu sestavení pro iOS nastavte možnost chování linkeru na Pouze sady SDK link frameworku nebo Propojit vše.
  3. V nastavení projektu ladění iOS zrušte zaškrtnutí políčka Povolit ladění a Povolit profilaci.

Životní cyklus rozšíření

Rozšíření může být jednoduché jako jedno UIViewController nebo složitější rozšíření, která představují více obrazovek uživatelského rozhraní. Když uživatel narazí na body rozšíření (například při sdílení obrázku), bude mít možnost si vybrat z rozšíření zaregistrovaných pro tento bod rozšíření.

Pokud si vyberou jedno z rozšíření vaší aplikace, UIViewController vytvoří se instance a zahájí normální životní cyklus kontroleru zobrazení. Na rozdíl od normální aplikace, která se pozastaví, ale obvykle se neukončí, když s nimi uživatel dokončí interakci, načtou se rozšíření, spustí a pak se opakovaně ukončí.

Rozšíření můžou komunikovat s hostitelskými aplikacemi prostřednictvím objektu NSExtensionContext . Některá rozšíření mají operace, které přijímají asynchronní zpětné volání s výsledky. Tyto zpětná volání se spustí na podprocesech na pozadí a rozšíření musí vzít v úvahu toto; Například pomocí NSObject.InvokeOnMainThread, pokud chtějí aktualizovat uživatelské rozhraní. Další podrobnosti najdete v části Komunikace s hostitelskou aplikací níže.

Rozšíření a jejich aplikace typu kontejner ve výchozím nastavení nemůžou komunikovat, i když jsou nainstalované společně. V některých případech je aplikace kontejneru v podstatě prázdný kontejner "expediční", jehož účel se obsluhuje po instalaci rozšíření. Pokud ale okolnosti určují, může aplikace kontejneru a rozšíření sdílet prostředky z společné oblasti. Rozšíření Today navíc může požádat svou aplikaci kontejneru o otevření adresy URL. Toto chování se zobrazuje ve widgetu Odpočítávání událostí.

Vytvoření rozšíření

Rozšíření (a jejich kontejnerové aplikace) musí být 64bitové binární soubory a sestavené pomocí sjednocených rozhraní API Xamarin.iOS. Při vývoji rozšíření budou vaše řešení obsahovat aspoň dva projekty: kontejnerovou aplikaci a jeden projekt pro každé rozšíření, které kontejner poskytuje.

Požadavky na projekt kontejnerové aplikace

Aplikace kontejneru použitá k instalaci rozšíření má následující požadavky:

  • Musí udržovat odkaz na projekt rozšíření.
  • Musí to být úplná aplikace (musí být schopná spustit a úspěšně spustit), i když nedělá nic víc, než aby poskytovala způsob instalace rozšíření.
  • Musí mít identifikátor sady, který je základem identifikátoru sady projektu rozšíření (další podrobnosti najdete v následující části).

Požadavky projektu rozšíření

Kromě toho má projekt rozšíření následující požadavky:

  • Musí mít identifikátor sady, který začíná identifikátorem sady prostředků aplikace kontejneru. Pokud má například aplikace kontejneru identifikátor com.myCompany.ContainerAppsady, může být com.myCompany.ContainerApp.MyExtensionidentifikátor rozšíření:

    Bundle identifiers

  • Musí definovat klíč NSExtensionPointIdentifiers odpovídající hodnotou (například com.apple.widget-extensionwidgetu Today Notification Center) v souboru Info.plist .

  • Musí také definovat NSExtensionMainStoryboard klíč nebo NSExtensionPrincipalClass klíč v souboru Info.plist s odpovídající hodnotou:

    • NSExtensionMainStoryboard Pomocí klíče zadejte název scénáře, který představuje hlavní uživatelské rozhraní rozšíření (minus.storyboard). Například Main pro Main.storyboard soubor.
    • NSExtensionPrincipalClass Klíč použijte k určení třídy, která bude inicializována při spuštění rozšíření. Hodnota se musí shodovat s hodnotou registru vaší UIViewController:

    Principal class registration

Konkrétní typy rozšíření můžou mít další požadavky. Například hlavní třída rozšíření Centra oznámení nebo Today musí implementovat INCWidgetProviding.

Důležité

Pokud projekt spustíte pomocí jedné šablony rozšíření poskytované Visual Studio pro Mac, většina (pokud ne všechny) tyto požadavky automaticky poskytne a splní pro vás šablona.

Názorný postup

V následujícím názorném postupu vytvoříte příklad widgetu Today , který vypočítá den a počet dnů zbývajících v roce:

An example Today widget that calculates the day and number of days remaining in the year

Vytvoření řešení

Pokud chcete vytvořit požadované řešení, postupujte takto:

  1. Nejprve vytvořte nový projekt aplikace pro iOS, jedno zobrazení a klikněte na tlačítko Další:

    First, create a new iOS, Single View App project and click the Next button

  2. Zavolejte projekt TodayContainer a klikněte na tlačítko Další :

    Call the project TodayContainer and click the Next button

  3. Ověřte název projektu a název řešení a kliknutím na tlačítko Vytvořit vytvořte řešení:

    Verify the Project Name and SolutionName and click the Create button to create the solution

  4. Dále v Průzkumník řešení klikněte pravým tlačítkem na řešení a přidejte nový projekt rozšíření pro iOS ze šablony Rozšíření Today:

    Next, in the Solution Explorer, right-click on the Solution and add a new iOS Extension project from the Today Extension template

  5. Zavolejte projekt DaysRemaining a klikněte na tlačítko Další :

    Call the project DaysRemaining and click the Next button

  6. Zkontrolujte projekt a kliknutím na tlačítko Vytvořit ho vytvořte:

    Review the project and click the Create button to create it

Výsledné řešení by teď mělo mít dva projekty, jak je znázorněno tady:

The resulting Solution should now have two projects, as shown here

Vytvoření uživatelského rozhraní rozšíření

Dále budete muset navrhnout rozhraní pro widget Today . Můžete to provést buď pomocí scénáře, nebo vytvořením uživatelského rozhraní v kódu. Obě metody budou podrobně popsány níže.

Použití scénářů

Pokud chcete vytvořit uživatelské rozhraní pomocí scénáře, postupujte takto:

  1. V Průzkumník řešení poklikejte na soubor projektu rozšíření a otevřete ho Main.storyboard pro úpravy:

    Double-click the Extension projects Main.storyboard file to open it for editing

  2. Vyberte popisek, který se automaticky přidal do uživatelského rozhraní podle šablony, a na kartě Widget v Průzkumníku vlastností ho pojmenujte TodayMessage:

    Select the Label that was automatically added to the UI by template and give it the Name TodayMessage in the Widget tab of the Properties Explorer

  3. Uložte změny do scénáře.

Použití kódu

Pokud chcete vytvořit uživatelské rozhraní v kódu, postupujte takto:

  1. V Průzkumník řešení vyberte projekt DaysRemaining, přidejte novou třídu a zavolejte jiCodeBasedViewController:

    Aelect the DaysRemaining project, add a new class and call it CodeBasedViewController

  2. Znovu v Průzkumník řešení poklikáním otevřete soubor přípony Info.plist pro úpravy:

    Double-click Extensions Info.plist file to open it for editing

  3. Vyberte zdrojové zobrazení (v dolní části obrazovky) a otevřete NSExtension uzel:

    Select the Source View from the bottom of the screen and open the NSExtension node

  4. NSExtensionMainStoryboard Odeberte klíč a přidejte NSExtensionPrincipalClass hodnotu s hodnotouCodeBasedViewController:

    Remove the NSExtensionMainStoryboard key and add a NSExtensionPrincipalClass with the value CodeBasedViewController

  5. Uloží vaše změny.

Potom upravte CodeBasedViewController.cs soubor a udělejte ho takto:

using System;
using Foundation;
using UIKit;
using NotificationCenter;
using CoreGraphics;

namespace DaysRemaining
{
  [Register("CodeBasedViewController")]
  public class CodeBasedViewController : UIViewController, INCWidgetProviding
  {
    public CodeBasedViewController ()
    {
    }

    public override void ViewDidLoad ()
    {
      base.ViewDidLoad ();

      // Add label to view
      var TodayMessage = new UILabel (new CGRect (0, 0, View.Frame.Width, View.Frame.Height)) {
        TextAlignment = UITextAlignment.Center
      };

      View.AddSubview (TodayMessage);

      // Insert code to power extension here...

    }
  }
}

Všimněte si, že odpovídá [Register("CodeBasedViewController")] hodnotě, kterou jste zadali pro NSExtensionPrincipalClass výše uvedenou hodnotu.

Kódování rozšíření

S vytvořeným uživatelským rozhraním otevřete soubor TodayViewController.cs nebo CodeBasedViewController.cs soubor (založený na metodě použité k vytvoření uživatelského rozhraní výše), změňte metodu ViewDidLoad a nastavte ji jako následující:

public override void ViewDidLoad ()
{
  base.ViewDidLoad ();

  // Calculate the values
  var dayOfYear = DateTime.Now.DayOfYear;
  var leapYearExtra = DateTime.IsLeapYear (DateTime.Now.Year) ? 1 : 0;
  var daysRemaining = 365 + leapYearExtra - dayOfYear;

  // Display the message
  if (daysRemaining == 1) {
    TodayMessage.Text = String.Format ("Today is day {0}. There is one day remaining in the year.", dayOfYear);
  } else {
    TodayMessage.Text = String.Format ("Today is day {0}. There are {1} days remaining in the year.", dayOfYear, daysRemaining);
  }
}

Pokud používáte metodu uživatelského rozhraní založenou // Insert code to power extension here... na kódu, nahraďte komentář novým kódem z výše uvedeného. Po zavolání základní implementace (a vložení popisku pro verzi založené na kódu) tento kód provede jednoduchý výpočet, který získá den v roce a kolik dní zbývá. Pak zobrazí zprávu v popisku (TodayMessage), který jste vytvořili v návrhu uživatelského rozhraní.

Všimněte si, že tento proces je podobný normálnímu procesu psaní aplikace. Rozšíření UIViewController má stejný životní cyklus jako kontroler zobrazení v aplikaci, s výjimkou rozšíření nemají režimy pozadí a nejsou pozastaveny, když je uživatel dokončí. Místo toho se rozšíření opakovaně inicializují a podle potřeby přidělují.

Vytvoření uživatelského rozhraní aplikace kontejneru

V tomto názorném postupu se aplikace kontejneru jednoduše používá jako metoda pro odeslání a instalaci rozšíření a neposkytuje žádné funkce. Upravte soubor TodayContainer Main.storyboard a přidejte nějaký text definující funkci Extension a postup jeho instalace:

Edit the TodayContainers Main.storyboard file and add some text defining the Extensions function and how to install it

Uložte změny do scénáře.

Testování rozšíření

Pokud chcete otestovat rozšíření v simulátoru iOS, spusťte aplikaci TodayContainer . Zobrazí se hlavní zobrazení kontejneru:

The containers main view will be displayed

Dále stiskněte tlačítko Domů v simulátoru, potáhnutím prstem dolů v horní části obrazovky otevřete Centrum oznámení, vyberte kartu Dnes a klikněte na tlačítko Upravit :

Hit the Home button in the Simulator, swipe down from the top of the screen to open the Notification Center, select the Today tab and click the Edit button

Přidejte rozšíření DaysRemaining do zobrazení Dnes a klikněte na tlačítko Hotovo:

Add the DaysRemaining Extension to the Today view and click the Done button

Nový widget se přidá do zobrazení Dnes a zobrazí se výsledky:

The new widget will be added to the Today view and the results will be displayed

Komunikace s hostitelskou aplikací

Příklad rozšíření Today, které jste vytvořili výše, nekomunikuje s jeho hostitelskou aplikací ( obrazovka Dnes ). Pokud ano, použije vlastnost ExtensionContextTodayViewController třídy.CodeBasedViewController

Pro rozšíření, která budou přijímat data z jejich hostitelských aplikací, jsou data ve formě pole NSExtensionItem objektů uložených ve vlastnosti InputItems ExtensionContext extension's UIViewController.

Ostatní rozšíření, například rozšíření pro úpravy fotek, mohou rozlišovat mezi uživatelem, který dokončil nebo zrušil používání. To bude signalizovat zpět do hostitelské aplikace prostřednictvím CompleteRequest a CancelRequest metody ExtensionContext vlastnost.

Další informace najdete v Průvodci programováním rozšíření aplikací společnosti Apple.

Komunikace s nadřazenou aplikací

Skupina aplikací umožňuje různým aplikacím (nebo aplikacím a jeho rozšířením) přístup k umístění sdíleného úložiště souborů. Skupiny aplikací se dají použít pro data, jako jsou:

Další informace najdete v části Skupiny aplikací v naší dokumentaci Práce s funkcemi .

MobileCoreServices

Při práci s rozšířeními použijte identifikátor UTI (Uniform Type Identifier) k vytvoření a manipulaci s daty, která se vyměňují mezi aplikací, jinými aplikacemi nebo službami.

MobileCoreServices.UTType Statická třída definuje následující pomocné vlastnosti, které se vztahují k definicím společnosti ApplekUTType...:

  • kUTTypeAlembic - Alembic
  • kUTTypeAliasFile - AliasFile
  • kUTTypeAliasRecord - AliasRecord
  • kUTTypeAppleICNS - AppleICNS
  • kUTTypeAppleProtectedMPEG4Audio - AppleProtectedMPEG4Audio
  • kUTTypeAppleProtectedMPEG4Video - AppleProtectedMPEG4Video
  • kUTTypeAppleScript - AppleScript
  • kUTTypeApplication - Application
  • kUTTypeApplicationBundle - ApplicationBundle
  • kUTTypeApplicationFile - ApplicationFile
  • kUTTypeArchive - Archive
  • kUTTypeAssemblyLanguageSource - AssemblyLanguageSource
  • kUTTypeAudio - Audio
  • kUTTypeAudioInterchangeFileFormat - AudioInterchangeFileFormat
  • kUTTypeAudiovisualContent - AudiovisualContent
  • kUTTypeAVIMovie - AVIMovie
  • kUTTypeBinaryPropertyList - BinaryPropertyList
  • kUTTypeBMP - BMP
  • kUTTypeBookmark - Bookmark
  • kUTTypeBundle - Bundle
  • kUTTypeBzip2Archive - Bzip2Archive
  • kUTTypeCalendarEvent - CalendarEvent
  • kUTTypeCHeader - CHeader
  • kUTTypeCommaSeparatedText - CommaSeparatedText
  • kUTTypeCompositeContent - CompositeContent
  • kUTTypeConformsToKey - ConformsToKey
  • kUTTypeContact - Contact
  • kUTTypeContent - Content
  • kUTTypeCPlusPlusHeader - CPlusPlusHeader
  • kUTTypeCPlusPlusSource - CPlusPlusSource
  • kUTTypeCSource - CSource
  • kUTTypeData - Database
  • kUTTypeDelimitedText - DelimitedText
  • kUTTypeDescriptionKey - DescriptionKey
  • kUTTypeDirectory - Directory
  • kUTTypeDiskImage - DiskImage
  • kUTTypeElectronicPublication - ElectronicPublication
  • kUTTypeEmailMessage - EmailMessage
  • kUTTypeExecutable - Executable
  • kUTExportedTypeDeclarationsKey - ExportedTypeDeclarationsKey
  • kUTTypeFileURL - FileURL
  • kUTTypeFlatRTFD - FlatRTFD
  • kUTTypeFolder - Folder
  • kUTTypeFont - Font
  • kUTTypeFramework - Framework
  • kUTTypeGIF - GIF
  • kUTTypeGNUZipArchive - GNUZipArchive
  • kUTTypeHTML - HTML
  • kUTTypeICO - ICO
  • kUTTypeIconFileKey - IconFileKey
  • kUTTypeIdentifierKey - IdentifierKey
  • kUTTypeImage - Image
  • kUTImportedTypeDeclarationsKey - ImportedTypeDeclarationsKey
  • kUTTypeInkText - InkText
  • kUTTypeInternetLocation - InternetLocation
  • kUTTypeItem - Item
  • kUTTypeJavaArchive - JavaArchive
  • kUTTypeJavaClass - JavaClass
  • kUTTypeJavaScript - JavaScript
  • kUTTypeJavaSource - JavaSource
  • kUTTypeJPEG - JPEG
  • kUTTypeJPEG2000 - JPEG2000
  • kUTTypeJSON - JSON
  • kUTType3dObject - k3dObject
  • kUTTypeLivePhoto - LivePhoto
  • kUTTypeLog - Log
  • kUTTypeM3UPlaylist - M3UPlaylist
  • kUTTypeMessage - Message
  • kUTTypeMIDIAudio - MIDIAudio
  • kUTTypeMountPoint - MountPoint
  • kUTTypeMovie - Movie
  • kUTTypeMP3 - MP3
  • kUTTypeMPEG - MPEG
  • kUTTypeMPEG2TransportStream - MPEG2TransportStream
  • kUTTypeMPEG2Video - MPEG2Video
  • kUTTypeMPEG4 - MPEG4
  • kUTTypeMPEG4Audio - MPEG4Audio
  • kUTTypeObjectiveCPlusPlusSource - ObjectiveCPlusPlusSource
  • kUTTypeObjectiveCSource - ObjectiveCSource
  • kUTTypeOSAScript - OSAScript
  • kUTTypeOSAScriptBundle - OSAScriptBundle
  • kUTTypePackage - Package
  • kUTTypePDF - PDF
  • kUTTypePerlScript - PerlScript
  • kUTTypePHPScript - PHPScript
  • kUTTypePICT - PICT
  • kUTTypePKCS12 - PKCS12
  • kUTTypePlainText - PlainText
  • kUTTypePlaylist - Playlist
  • kUTTypePluginBundle - PluginBundle
  • kUTTypePNG - PNG
  • kUTTypePolygon - Polygon
  • kUTTypePresentation - Presentation
  • kUTTypePropertyList - PropertyList
  • kUTTypePythonScript - PythonScript
  • kUTTypeQuickLookGenerator - QuickLookGenerator
  • kUTTypeQuickTimeImage - QuickTimeImage
  • kUTTypeQuickTimeMovie - QuickTimeMovie
  • kUTTypeRawImage - RawImage
  • kUTTypeReferenceURLKey - ReferenceURLKey
  • kUTTypeResolvable - Resolvable
  • kUTTypeRTF - RTF
  • kUTTypeRTFD - RTFD
  • kUTTypeRubyScript - RubyScript
  • kUTTypeScalableVectorGraphics - ScalableVectorGraphics
  • kUTTypeScript - Script
  • kUTTypeShellScript - ShellScript
  • kUTTypeSourceCode - SourceCode
  • kUTTypeSpotlightImporter - SpotlightImporter
  • kUTTypeSpreadsheet - Spreadsheet
  • kUTTypeStereolithography - Stereolithography
  • kUTTypeSwiftSource - SwiftSource
  • kUTTypeSymLink - SymLink
  • kUTTypeSystemPreferencesPane - SystemPreferencesPane
  • kUTTypeTabSeparatedText - TabSeparatedText
  • kUTTagClassFilenameExtension - TagClassFilenameExtension
  • kUTTagClassMIMEType - TagClassMIMEType
  • kUTTypeTagSpecificationKey - TagSpecificationKey
  • kUTTypeText - Text
  • kUTType3DContent - ThreeDContent
  • kUTTypeTIFF - TIFF
  • kUTTypeToDoItem - ToDoItem
  • kUTTypeTXNTextAndMultimediaData - TXNTextAndMultimediaData
  • kUTTypeUniversalSceneDescription - UniversalSceneDescription
  • kUTTypeUnixExecutable - UnixExecutable
  • kUTTypeURL - URL
  • kUTTypeURLBookmarkData - URLBookmarkData
  • kUTTypeUTF16ExternalPlainText - UTF16ExternalPlainText
  • kUTTypeUTF16PlainText - UTF16PlainText
  • kUTTypeUTF8PlainText - UTF8PlainText
  • kUTTypeUTF8TabSeparatedText - UTF8TabSeparatedText
  • kUTTypeVCard - VCard
  • kUTTypeVersionKey - VersionKey
  • kUTTypeVideo - Video
  • kUTTypeVolume - Volume
  • kUTTypeWaveformAudio - WaveformAudio
  • kUTTypeWebArchive - WebArchive
  • kUTTypeWindowsExecutable - WindowsExecutable
  • kUTTypeX509Certificate - X509Certificate
  • kUTTypeXML - XML
  • kUTTypeXMLPropertyList - XMLPropertyList
  • kUTTypeXPCService - XPCService
  • kUTTypeZipArchive - ZipArchive

Prohlédněte si následující příklad:

using MobileCoreServices;
...

NSItemProvider itemProvider = new NSItemProvider ();
itemProvider.LoadItem(UTType.PropertyList ,null, (item, err) => {
    if (err == null) {
        NSDictionary results = (NSDictionary )item;
        NSString baseURI =
results.ObjectForKey("NSExtensionJavaScriptPreprocessingResultsKey");
    }
});

Další informace najdete v části Skupiny aplikací v naší dokumentaci Práce s funkcemi .

Bezpečnostní opatření a důležité informace

Rozšíření mají pro ně výrazně méně paměti než aplikace. Očekává se, že budou provádět rychle a s minimálním vniknutím uživatele a aplikace, ve které jsou hostované. Rozšíření by ale také mělo poskytovat charakteristickou, užitečnou funkci pro využívání aplikace pomocí brandovaného uživatelského rozhraní, které uživateli umožní identifikovat vývojáře rozšíření nebo aplikaci typu Kontejner, do které patří.

Vzhledem k těmto přísným požadavkům byste měli nasadit pouze rozšíření, která byla důkladně otestována a optimalizována pro výkon a spotřebu paměti.

Shrnutí

Tento dokument se zabývá rozšířeními, co jsou, typem bodů rozšíření a známými omezeními, která platí pro rozšíření pro iOS. Popisuje vytváření, distribuci, instalaci a spouštění rozšíření a životní cyklus rozšíření. Poskytl návod k vytvoření jednoduchého widgetu Today zobrazující dva způsoby, jak vytvořit uživatelské rozhraní widgetu pomocí scénářů nebo kódu. Ukázalo se, jak otestovat rozšíření v simulátoru iOS. Nakonec stručně probrala komunikaci s hostitelskou aplikací a několik preventivních opatření a aspektů, které by se měly provést při vývoji rozšíření.