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:
- Architektury uživatelského rozhraní sady Health Kit a Sady událostí nejsou k dispozici.
- Rozšíření nemůžou používat rozšířené režimy pozadí.
- Rozšíření nemají přístup k fotoaparátům nebo mikrofonům zařízení (i když můžou přistupovat k existujícím mediálním souborům)
- Rozšíření nemohou přijímat data Air Drop (i když mohou přenášet data přes Air Drop).
- UiActionSheet a UIAlertView nejsou k dispozici; rozšíření musí používat UIAlertController
- Několik členů UIApplication není k dispozici: UIApplication.SharedApplication, UIApplication.OpenUrl, UIApplication.BeginIgnoringInteractionEvents a UIApplication.EndIgnoringInteractionEvents
- IOS vynucuje pro dnešní rozšíření limit využití paměti o velikosti 16 MB.
- Ve výchozím nastavení rozšíření klávesnice nemají přístup k síti. To má vliv na ladění na zařízení (omezení se v simulátoru nevynucuje), protože Xamarin.iOS vyžaduje, aby ladění fungovalo v síti. Přístup k síti je možné vyžádat nastavením
Requests Open Access
hodnoty v souboru Info.plist projektu naYes
hodnotu . Další informace oomezeních
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ázení 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í:
- Sestavení balíčku aplikace v konfiguraci vydané verze
- V nastavení projektu sestavení pro iOS nastavte možnost chování linkeru na Pouze sady SDK link frameworku nebo Propojit vše.
- 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.ContainerApp
sady, může býtcom.myCompany.ContainerApp.MyExtension
identifikátor rozšíření:Musí definovat klíč
NSExtensionPointIdentifier
s odpovídající hodnotou (napříkladcom.apple.widget-extension
widgetu Today Notification Center) v souboruInfo.plist
.Musí také definovat
NSExtensionMainStoryboard
klíč neboNSExtensionPrincipalClass
klíč v souboruInfo.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říkladMain
proMain.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
:
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:
Vytvoření řešení
Pokud chcete vytvořit požadované řešení, postupujte takto:
Nejprve vytvořte nový projekt aplikace pro iOS, jedno zobrazení a klikněte na tlačítko Další:
Zavolejte projekt
TodayContainer
a klikněte na tlačítko Další :Ověřte název projektu a název řešení a kliknutím na tlačítko Vytvořit vytvořte řešení:
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:
Zavolejte projekt
DaysRemaining
a klikněte na tlačítko Další :Zkontrolujte projekt a kliknutím na tlačítko Vytvořit ho vytvořte:
Výsledné řešení by teď mělo mít dva projekty, jak je znázorněno tady:
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:
V Průzkumník řešení poklikejte na soubor projektu rozšíření a otevřete ho
Main.storyboard
pro úpravy: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
:Uložte změny do scénáře.
Použití kódu
Pokud chcete vytvořit uživatelské rozhraní v kódu, postupujte takto:
V Průzkumník řešení vyberte projekt DaysRemaining, přidejte novou třídu a zavolejte ji
CodeBasedViewController
:Znovu v Průzkumník řešení poklikáním otevřete soubor přípony
Info.plist
pro úpravy:Vyberte zdrojové zobrazení (v dolní části obrazovky) a otevřete
NSExtension
uzel:NSExtensionMainStoryboard
Odeberte klíč a přidejteNSExtensionPrincipalClass
hodnotu s hodnotouCodeBasedViewController
:Uložte provedené 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:
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:
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 :
Přidejte rozšíření DaysRemaining do zobrazení Dnes a klikněte na tlačítko Hotovo:
Nový widget se přidá do zobrazení Dnes a zobrazí se výsledky:
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 ExtensionContext TodayViewController
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:
- Nastavení Apple Watch.
- Sdílené NSUserDefaults.
- Sdílené soubory.
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í.