Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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 Accesshodnoty v souboru Info.plist projektu naYeshodnotu . 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.ContainerAppsady, může býtcom.myCompany.ContainerApp.MyExtensionidentifikátor rozšíření:
Musí definovat klíč
NSExtensionPointIdentifiers odpovídající hodnotou (napříkladcom.apple.widget-extensionwidgetu Today Notification Center) v souboruInfo.plist.Musí také definovat
NSExtensionMainStoryboardklíč neboNSExtensionPrincipalClassklíč v souboruInfo.plists odpovídající hodnotou:NSExtensionMainStoryboardPomocí klíče zadejte název scénáře, který představuje hlavní uživatelské rozhraní rozšíření (minus.storyboard). NapříkladMainproMain.storyboardsoubor.NSExtensionPrincipalClassKlíč 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
TodayContainera 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
DaysRemaininga 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.storyboardpro ú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.plistpro úpravy:Vyberte zdrojové zobrazení (v dolní části obrazovky) a otevřete
NSExtensionuzel:NSExtensionMainStoryboardOdeberte klíč a přidejteNSExtensionPrincipalClasshodnotu 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-AlembickUTTypeAliasFile-AliasFilekUTTypeAliasRecord-AliasRecordkUTTypeAppleICNS-AppleICNSkUTTypeAppleProtectedMPEG4Audio-AppleProtectedMPEG4AudiokUTTypeAppleProtectedMPEG4Video-AppleProtectedMPEG4VideokUTTypeAppleScript-AppleScriptkUTTypeApplication-ApplicationkUTTypeApplicationBundle-ApplicationBundlekUTTypeApplicationFile-ApplicationFilekUTTypeArchive-ArchivekUTTypeAssemblyLanguageSource-AssemblyLanguageSourcekUTTypeAudio-AudiokUTTypeAudioInterchangeFileFormat-AudioInterchangeFileFormatkUTTypeAudiovisualContent-AudiovisualContentkUTTypeAVIMovie-AVIMoviekUTTypeBinaryPropertyList-BinaryPropertyListkUTTypeBMP-BMPkUTTypeBookmark-BookmarkkUTTypeBundle-BundlekUTTypeBzip2Archive-Bzip2ArchivekUTTypeCalendarEvent-CalendarEventkUTTypeCHeader-CHeaderkUTTypeCommaSeparatedText-CommaSeparatedTextkUTTypeCompositeContent-CompositeContentkUTTypeConformsToKey-ConformsToKeykUTTypeContact-ContactkUTTypeContent-ContentkUTTypeCPlusPlusHeader-CPlusPlusHeaderkUTTypeCPlusPlusSource-CPlusPlusSourcekUTTypeCSource-CSourcekUTTypeData-DatabasekUTTypeDelimitedText-DelimitedTextkUTTypeDescriptionKey-DescriptionKeykUTTypeDirectory-DirectorykUTTypeDiskImage-DiskImagekUTTypeElectronicPublication-ElectronicPublicationkUTTypeEmailMessage-EmailMessagekUTTypeExecutable-ExecutablekUTExportedTypeDeclarationsKey-ExportedTypeDeclarationsKeykUTTypeFileURL-FileURLkUTTypeFlatRTFD-FlatRTFDkUTTypeFolder-FolderkUTTypeFont-FontkUTTypeFramework-FrameworkkUTTypeGIF-GIFkUTTypeGNUZipArchive-GNUZipArchivekUTTypeHTML-HTMLkUTTypeICO-ICOkUTTypeIconFileKey-IconFileKeykUTTypeIdentifierKey-IdentifierKeykUTTypeImage-ImagekUTImportedTypeDeclarationsKey-ImportedTypeDeclarationsKeykUTTypeInkText-InkTextkUTTypeInternetLocation-InternetLocationkUTTypeItem-ItemkUTTypeJavaArchive-JavaArchivekUTTypeJavaClass-JavaClasskUTTypeJavaScript-JavaScriptkUTTypeJavaSource-JavaSourcekUTTypeJPEG-JPEGkUTTypeJPEG2000-JPEG2000kUTTypeJSON-JSONkUTType3dObject-k3dObjectkUTTypeLivePhoto-LivePhotokUTTypeLog-LogkUTTypeM3UPlaylist-M3UPlaylistkUTTypeMessage-MessagekUTTypeMIDIAudio-MIDIAudiokUTTypeMountPoint-MountPointkUTTypeMovie-MoviekUTTypeMP3-MP3kUTTypeMPEG-MPEGkUTTypeMPEG2TransportStream-MPEG2TransportStreamkUTTypeMPEG2Video-MPEG2VideokUTTypeMPEG4-MPEG4kUTTypeMPEG4Audio-MPEG4AudiokUTTypeObjectiveCPlusPlusSource-ObjectiveCPlusPlusSourcekUTTypeObjectiveCSource-ObjectiveCSourcekUTTypeOSAScript-OSAScriptkUTTypeOSAScriptBundle-OSAScriptBundlekUTTypePackage-PackagekUTTypePDF-PDFkUTTypePerlScript-PerlScriptkUTTypePHPScript-PHPScriptkUTTypePICT-PICTkUTTypePKCS12-PKCS12kUTTypePlainText-PlainTextkUTTypePlaylist-PlaylistkUTTypePluginBundle-PluginBundlekUTTypePNG-PNGkUTTypePolygon-PolygonkUTTypePresentation-PresentationkUTTypePropertyList-PropertyListkUTTypePythonScript-PythonScriptkUTTypeQuickLookGenerator-QuickLookGeneratorkUTTypeQuickTimeImage-QuickTimeImagekUTTypeQuickTimeMovie-QuickTimeMoviekUTTypeRawImage-RawImagekUTTypeReferenceURLKey-ReferenceURLKeykUTTypeResolvable-ResolvablekUTTypeRTF-RTFkUTTypeRTFD-RTFDkUTTypeRubyScript-RubyScriptkUTTypeScalableVectorGraphics-ScalableVectorGraphicskUTTypeScript-ScriptkUTTypeShellScript-ShellScriptkUTTypeSourceCode-SourceCodekUTTypeSpotlightImporter-SpotlightImporterkUTTypeSpreadsheet-SpreadsheetkUTTypeStereolithography-StereolithographykUTTypeSwiftSource-SwiftSourcekUTTypeSymLink-SymLinkkUTTypeSystemPreferencesPane-SystemPreferencesPanekUTTypeTabSeparatedText-TabSeparatedTextkUTTagClassFilenameExtension-TagClassFilenameExtensionkUTTagClassMIMEType-TagClassMIMETypekUTTypeTagSpecificationKey-TagSpecificationKeykUTTypeText-TextkUTType3DContent-ThreeDContentkUTTypeTIFF-TIFFkUTTypeToDoItem-ToDoItemkUTTypeTXNTextAndMultimediaData-TXNTextAndMultimediaDatakUTTypeUniversalSceneDescription-UniversalSceneDescriptionkUTTypeUnixExecutable-UnixExecutablekUTTypeURL-URLkUTTypeURLBookmarkData-URLBookmarkDatakUTTypeUTF16ExternalPlainText-UTF16ExternalPlainTextkUTTypeUTF16PlainText-UTF16PlainTextkUTTypeUTF8PlainText-UTF8PlainTextkUTTypeUTF8TabSeparatedText-UTF8TabSeparatedTextkUTTypeVCard-VCardkUTTypeVersionKey-VersionKeykUTTypeVideo-VideokUTTypeVolume-VolumekUTTypeWaveformAudio-WaveformAudiokUTTypeWebArchive-WebArchivekUTTypeWindowsExecutable-WindowsExecutablekUTTypeX509Certificate-X509CertificatekUTTypeXML-XMLkUTTypeXMLPropertyList-XMLPropertyListkUTTypeXPCService-XPCServicekUTTypeZipArchive-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í.


















