Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Tworzenie rozszerzeń w systemie iOS wideo
Rozszerzenia, jak wprowadzono w systemie iOS 8, są wyspecjalizowane UIViewControllers , które są prezentowane przez system iOS w standardowych kontekstach, takich jak w Centrum powiadomień, jako niestandardowe typy klawiatury żądane przez użytkownika do wykonywania wyspecjalizowanych danych wejściowych lub innych kontekstów, takich jak edytowanie zdjęcia, gdzie rozszerzenie może zapewnić filtry efektów specjalnych.
Wszystkie rozszerzenia są instalowane w połączeniu z aplikacją kontenera (z obydwoma elementami napisanymi przy użyciu 64-bitowych ujednoliconych interfejsów API) i są aktywowane z określonego punktu rozszerzenia w aplikacji hosta. A ponieważ będą one używane jako suplementy do istniejących funkcji systemowych, muszą być wysokiej wydajności, chudy i solidne.
Punkty rozszerzenia
| Type | Opis | Punkt rozszerzenia | Aplikacja hosta |
|---|---|---|---|
| Akcja | Wyspecjalizowany edytor lub przeglądarka dla określonego typu nośnika | com.apple.ui-services |
Dowolne |
| Dostawca dokumentów | Zezwala aplikacji na korzystanie ze zdalnego magazynu dokumentów | com.apple.fileprovider-ui |
Aplikacje korzystające z kontrolki UIDocumentPickerViewController |
| Klawiatura | Klawiatury alternatywne | com.apple.keyboard-service |
Dowolne |
| Edytowanie zdjęć | Manipulowanie zdjęciami i edytowanie | com.apple.photo-editing |
Edytor Photos.app |
| Udostępnij | Udostępnia dane sieciom społecznościowym, usługom obsługi wiadomości itp. | com.apple.share-services |
Dowolne |
| Today | "Widżety" wyświetlane na ekranie Dzisiaj lub w Centrum powiadomień | com.apple.widget-extensions |
Dzisiaj i Centrum powiadomień |
Dodano dodatkowe punkty rozszerzenia w systemach iOS 10 i iOS 12. Pełną tabelę wszystkich obsługiwanych typów można znaleźć w przewodniku programowania rozszerzeń aplikacji systemu iOS.
Ograniczenia
Rozszerzenia mają szereg ograniczeń, z których niektóre są uniwersalne dla wszystkich typów (na przykład żaden typ rozszerzenia nie może uzyskać dostępu do kamer lub mikrofonów), podczas gdy inne typy rozszerzenia mogą mieć określone ograniczenia dotyczące ich użycia (na przykład niestandardowe klawiatury nie mogą być używane do bezpiecznych pól wprowadzania danych, takich jak hasła).
Ograniczenia uniwersalne to:
- Zestaw kondycji i struktury interfejsu użytkownika zestawu zdarzeń nie są dostępne
- Rozszerzenia nie mogą używać rozszerzonych trybów tła
- Rozszerzenia nie mogą uzyskać dostępu do kamer lub mikrofonów urządzenia (chociaż mogą uzyskiwać dostęp do istniejących plików multimedialnych)
- Rozszerzenia nie mogą odbierać danych z funkcji Air Drop (chociaż mogą przesyłać dane za pośrednictwem funkcji Air Drop)
- UIActionSheet i UIAlertView są niedostępne; rozszerzenia muszą używać interfejsu użytkownikaAlertController
- Kilku członków interfejsu użytkownikaApplication jest niedostępnych: UIApplication.SharedApplication, UIApplication.OpenUrl, UIApplication.BeginIgnoringInteractionEvents i UIApplication.EndIgnoringInteractionEvents
- System iOS wymusza limit użycia pamięci 16 MB dla dzisiejszych rozszerzeń.
- Domyślnie rozszerzenia klawiatury nie mają dostępu do sieci. Ma to wpływ na debugowanie na urządzeniu (ograniczenie nie jest wymuszane w symulatorze), ponieważ platforma Xamarin.iOS wymaga dostępu sieciowego do debugowania w celu działania. Istnieje możliwość żądania dostępu do sieci przez ustawienie
Requests Open Accesswartości w pliku Info.plist projektu naYeswartość . Aby uzyskać więcej informacji na temat ograniczeń rozszerzeń klawiatury, zobacz Przewodnik po klawiaturze niestandardowej firmy Apple.
Aby zapoznać się z poszczególnymi ograniczeniami, zobacz Przewodnik programowania rozszerzeń aplikacji firmy Apple.
Dystrybucja, instalowanie i uruchamianie rozszerzeń
Rozszerzenia są dystrybuowane z poziomu aplikacji kontenera, która z kolei jest przesyłana i dystrybuowana za pośrednictwem sklepu App Store. Rozszerzenia dystrybuowane z aplikacją są instalowane w tym momencie, ale użytkownik musi jawnie włączyć każde rozszerzenie. Różne typy rozszerzeń są włączone na różne sposoby; kilku wymaga od użytkownika przejścia do aplikacji Ustawienia i włączenia ich z tego miejsca. Podczas gdy inne są włączone w momencie użycia, takie jak włączanie rozszerzenia udostępniania podczas wysyłania zdjęcia.
Aplikacja, w której jest używane rozszerzenie (gdzie użytkownik napotka punkt rozszerzenia) jest określany jako aplikacja hosta, ponieważ jest to aplikacja, która hostuje rozszerzenie podczas jego wykonywania. Aplikacja, która instaluje rozszerzenie, jest aplikacją kontenera, ponieważ jest to aplikacja, która zawierała rozszerzenie podczas instalacji.
Zazwyczaj aplikacja kontenera opisuje rozszerzenie i przeprowadza użytkownika przez proces włączania go.
Debugowanie i wydawanie wersji rozszerzeń
Limity pamięci dla uruchomionych rozszerzeń aplikacji są znacznie niższe niż limity pamięci stosowane do aplikacji pierwszego planu. Symulatory z systemem iOS mają mniej ograniczeń stosowanych do rozszerzeń i można wykonać rozszerzenie bez żadnych problemów. Jednak uruchomienie tego samego rozszerzenia na urządzeniu może prowadzić do nieoczekiwanych wyników, w tym awarii rozszerzenia lub agresywnego zakończenia przez system. W związku z tym przed jego wysyłką upewnij się, że skompilujesz i przetestujesz rozszerzenie na urządzeniu.
Upewnij się, że następujące ustawienia są stosowane do projektu kontenera i wszystkich odwołanych rozszerzeń:
- Skompiluj pakiet aplikacji w konfiguracji wydania .
- W ustawieniach projektu kompilacji systemu iOS ustaw opcję Zachowanie konsolidatora na Opcję Połącz tylko zestawy SDK struktury lub Połącz wszystkie.
- W ustawieniach projektu debugowania systemu iOS usuń zaznaczenie opcji Włącz debugowanie i Włącz profilowanie.
Cykl życia rozszerzenia
Rozszerzenie może być tak proste, jak pojedynczy element UIViewController lub bardziej złożone rozszerzenia, które prezentują wiele ekranów interfejsu użytkownika. Gdy użytkownik napotka punkty rozszerzenia (na przykład podczas udostępniania obrazu), będzie miał możliwość wyboru z rozszerzeń zarejestrowanych dla tego punktu rozszerzenia.
Jeśli wybierzą jedno z rozszerzeń aplikacji, zostanie utworzone wystąpienie i UIViewController rozpocznie normalny cykl życia kontrolera widoku. Jednak w przeciwieństwie do normalnej aplikacji, która jest zawieszona, ale nie jest zwykle przerywana po zakończeniu interakcji z nimi przez użytkownika, rozszerzenia są ładowane, wykonywane, a następnie wielokrotnie przerywane.
Rozszerzenia mogą komunikować się z aplikacjami hosta za pośrednictwem obiektu NSExtensionContext . Niektóre rozszerzenia mają operacje, które odbierają asynchroniczne wywołania zwrotne z wynikami. Te wywołania zwrotne zostaną wykonane w wątkach w tle, a rozszerzenie musi wziąć to pod uwagę; na przykład przy użyciu obiektu NSObject.InvokeOnMainThread , jeśli chcą zaktualizować interfejs użytkownika. Aby uzyskać więcej informacji, zobacz sekcję Komunikacja z aplikacją hosta poniżej.
Domyślnie rozszerzenia i ich aplikacje kontenerów nie mogą komunikować się, mimo że są instalowane razem. W niektórych przypadkach aplikacja kontenera jest zasadniczo pustym kontenerem "wysyłki", którego celem jest obsługiwana po zainstalowaniu rozszerzenia. Jeśli jednak dyktują okoliczności, aplikacja kontenera i rozszerzenie mogą udostępniać zasoby ze wspólnego obszaru. Ponadto rozszerzenie Today może zażądać, aby aplikacja kontenera otworzyła adres URL. To zachowanie jest wyświetlane w widżecie odliczania zdarzeń.
Tworzenie rozszerzenia
Rozszerzenia (i ich aplikacje kontenera) muszą być 64-bitowymi plikami binarnymi i skompilowane przy użyciu ujednoliconych interfejsów API platformy Xamarin.iOS. Podczas tworzenia rozszerzenia twoje rozwiązania będą zawierać co najmniej dwa projekty: aplikację kontenera i jeden projekt dla każdego rozszerzenia, które zapewnia kontener.
Wymagania dotyczące projektu aplikacji kontenera
Aplikacja kontenera używana do instalowania rozszerzenia ma następujące wymagania:
- Musi on obsługiwać odwołanie do projektu Extension.
- Musi to być kompletna aplikacja (musi być w stanie uruchomić i uruchomić ją pomyślnie), nawet jeśli nie wykonuje ona nic więcej niż zapewnia sposób instalowania rozszerzenia.
- Musi mieć identyfikator pakietu, który jest podstawą identyfikatora pakietu projektu Rozszerzenia (zobacz sekcję poniżej, aby uzyskać więcej informacji).
Wymagania dotyczące projektu rozszerzenia
Ponadto projekt rozszerzenia ma następujące wymagania:
Musi mieć identyfikator pakietu rozpoczynający się od identyfikatora pakietu aplikacji kontenera. Jeśli na przykład aplikacja kontenera ma identyfikator
com.myCompany.ContainerApppakietu , identyfikator rozszerzenia może mieć wartośćcom.myCompany.ContainerApp.MyExtension:
Musi zdefiniować klucz
NSExtensionPointIdentifierz odpowiednią wartością (nacom.apple.widget-extensionprzykład dla widżetu Centrum powiadomień dzisiaj ) w plikuInfo.plist.Musi również zdefiniować
NSExtensionMainStoryboardklucz lubNSExtensionPrincipalClassklucz w plikuInfo.plistz odpowiednią wartością:NSExtensionMainStoryboardUżyj klucza, aby określić nazwę scenorysu, który przedstawia główny interfejs użytkownika rozszerzenia (minus.storyboard). Na przykładMaindlaMain.storyboardpliku.NSExtensionPrincipalClassUżyj klucza, aby określić klasę, która zostanie zainicjowana po uruchomieniu rozszerzenia. Wartość musi być zgodna z wartością Register elementuUIViewController:

Określone typy rozszerzeń mogą mieć dodatkowe wymagania. Na przykład klasa główna rozszerzenia Today lub Notification Center musi implementować funkcję INCWidgetProviding.
Ważne
Jeśli rozpoczniesz projekt przy użyciu jednego z szablonów Rozszerzeń dostarczonych przez Visual Studio dla komputerów Mac, większość (jeśli nie wszystkie) te wymagania zostaną dostarczone i spełnione automatycznie przez szablon.
Przewodnik
W poniższym przewodniku utworzysz przykładowy widżet Today , który oblicza dzień i liczbę dni pozostałych w roku:
Tworzenie rozwiązania
Aby utworzyć wymagane rozwiązanie, wykonaj następujące czynności:
Najpierw utwórz nowy projekt aplikacji dla systemu iOS, Single View i kliknij przycisk Dalej :
Wywołaj projekt
TodayContaineri kliknij przycisk Dalej :Sprawdź nazwę projektu i nazwę rozwiązania, a następnie kliknij przycisk Utwórz, aby utworzyć rozwiązanie:
Następnie w Eksplorator rozwiązań kliknij prawym przyciskiem myszy pozycję Rozwiązanie i dodaj nowy projekt rozszerzenia systemu iOS z szablonu Today Extension (Dzisiejsze rozszerzenie):
Wywołaj projekt
DaysRemainingi kliknij przycisk Dalej :Przejrzyj projekt i kliknij przycisk Utwórz , aby go utworzyć:
Wynikowe rozwiązanie powinno teraz mieć dwa projekty, jak pokazano poniżej:
Tworzenie interfejsu użytkownika rozszerzenia
Następnie należy zaprojektować interfejs dla widżetu Dzisiaj . Można to zrobić przy użyciu scenorysu lub tworząc interfejs użytkownika w kodzie. Obie metody zostaną szczegółowo omówione poniżej.
Korzystanie z scenorysów
Aby skompilować interfejs użytkownika za pomocą scenorysu, wykonaj następujące czynności:
W Eksplorator rozwiązań kliknij dwukrotnie plik projektu
Main.storyboardRozszerzenia, aby otworzyć go do edycji:Wybierz etykietę, która została automatycznie dodana do interfejsu użytkownika według szablonu, i nadaj jej nazwę
TodayMessagena karcie Widżet Eksploratora właściwości:Zapisz zmiany w scenorysie.
Korzystanie z kodu
Aby skompilować interfejs użytkownika w kodzie, wykonaj następujące czynności:
W Eksplorator rozwiązań wybierz projekt DaysRemaining, dodaj nową klasę i wywołaj ją
CodeBasedViewController:Ponownie w Eksplorator rozwiązań kliknij dwukrotnie plik rozszerzenia
Info.plist, aby otworzyć go do edycji:Wybierz widok źródła (w dolnej części ekranu) i otwórz
NSExtensionwęzeł:NSExtensionMainStoryboardUsuń klucz i dodaj elementNSExtensionPrincipalClassz wartościąCodeBasedViewController:Zapisz zmiany.
Następnie zmodyfikuj CodeBasedViewController.cs plik i utwórz go w następujący sposób:
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...
}
}
}
Zwróć uwagę, że wartość [Register("CodeBasedViewController")] jest zgodna z wartością określoną dla powyższej NSExtensionPrincipalClass wartości.
Kodowanie rozszerzenia
Po utworzeniu interfejsu użytkownika otwórz TodayViewController.cs plik lub CodeBasedViewController.cs (na podstawie metody użytej do utworzenia interfejsu użytkownika powyżej), zmień metodę ViewDidLoad i ustaw ją tak:
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);
}
}
Jeśli używasz metody interfejsu użytkownika opartego na kodzie, zastąp // Insert code to power extension here... komentarz nowym kodem z powyższego. Po wywołaniu implementacji podstawowej (i wstawieniu etykiety dla wersji opartej na kodzie) ten kod wykonuje proste obliczenia, aby uzyskać dzień roku i liczbę pozostałych dni. Następnie zostanie wyświetlony komunikat w etykiecie (TodayMessage), która została utworzona w projekcie interfejsu użytkownika.
Zwróć uwagę, że ten proces jest podobny do normalnego procesu pisania aplikacji. Rozszerzenie UIViewController ma ten sam cykl życia co kontroler widoku w aplikacji, z wyjątkiem rozszerzeń nie mają trybów w tle i nie są zawieszone po zakończeniu korzystania z nich przez użytkownika. Zamiast tego rozszerzenia są wielokrotnie inicjowane i delokowane zgodnie z potrzebami.
Tworzenie interfejsu użytkownika aplikacji kontenera
W tym przewodniku aplikacja kontenera jest po prostu używana jako metoda dostarczania i instalowania rozszerzenia oraz nie zapewnia własnych funkcji. Edytuj plik TodayContainer Main.storyboard i dodaj tekst definiujący funkcję rozszerzenia oraz sposób jego instalowania:
Zapisz zmiany w scenorysie.
Testowanie rozszerzenia
Aby przetestować rozszerzenie w symulatorze systemu iOS, uruchom aplikację TodayContainer . Zostanie wyświetlony widok główny kontenera:
Następnie naciśnij przycisk Narzędzia główne w symulatorze, przesuń palcem w dół z góry ekranu, aby otworzyć Centrum powiadomień, wybierz kartę Dzisiaj i kliknij przycisk Edytuj :
Dodaj rozszerzenie DaysRemaining do widoku Dzisiaj i kliknij przycisk Gotowe:
Nowy widżet zostanie dodany do widoku Dzisiaj , a wyniki zostaną wyświetlone:
Komunikacja z aplikacją hosta
Przykładowe utworzone powyżej rozszerzenie Today nie komunikuje się z aplikacją hosta (ekran Dzisiaj). Jeśli tak, użyje właściwości TodayViewController ExtensionContext klas lubCodeBasedViewController.
W przypadku rozszerzeń, które będą odbierać dane z aplikacji hosta, dane są w postaci tablicy obiektów NSExtensionItem przechowywanych we właściwości InputItems rozszerzeniaContext rozszerzenia UIViewController.
Inne rozszerzenia, takie jak rozszerzenia do edycji zdjęć, mogą odróżnić użytkownika od ukończenia lub anulowania użycia. Zostanie to zasygnalizowane z powrotem do aplikacji hosta za pośrednictwem metod CompleteRequest i CancelRequest właściwości ExtensionContext.
Aby uzyskać więcej informacji, zobacz Przewodnik programowania rozszerzeń aplikacji firmy Apple.
Komunikacja z aplikacją nadrzędną
Grupa aplikacji umożliwia różnym aplikacjom (lub jej rozszerzeń) dostęp do udostępnionej lokalizacji przechowywania plików. Grupy aplikacji mogą służyć do obsługi danych, takich jak:
- Ustawienia zegarka Apple Watch.
- Udostępnione NSUserDefaults.
- Pliki udostępnione.
Aby uzyskać więcej informacji, zobacz sekcję Grupy aplikacji w dokumentacji Dotyczącej pracy z możliwościami .
MobileCoreServices
Podczas pracy z rozszerzeniami użyj ujednoliconego identyfikatora typu (UTI), aby utworzyć i manipulować danymi wymienianymi między aplikacją, innymi aplikacjami i/lub usługami.
Klasa statyczna MobileCoreServices.UTType definiuje następujące właściwości pomocnicze, które odnoszą się do definicji firmy kUTType... Apple:
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
Zobacz poniższy przykład:
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");
}
});
Aby uzyskać więcej informacji, zobacz sekcję Grupy aplikacji w dokumentacji Dotyczącej pracy z możliwościami .
Środki ostrożności i zagadnienia
Rozszerzenia mają znacznie mniejszą ilość dostępnej pamięci niż aplikacje. Oczekuje się, że będą one działać szybko i z minimalnym włamaniem do użytkownika i aplikacji, w której są hostowane. Jednak rozszerzenie powinno również zapewnić charakterystyczną, przydatną funkcję do korzystania z aplikacji z markowym interfejsem użytkownika, który umożliwia użytkownikowi identyfikację dewelopera rozszerzenia lub aplikacji kontenera, do której należą.
Biorąc pod uwagę te ścisłe wymaganie, należy wdrożyć tylko rozszerzenia, które zostały dokładnie przetestowane i zoptymalizowane pod kątem wydajności i zużycia pamięci.
Podsumowanie
W tym dokumencie opisano rozszerzenia, czym są, typ punktów rozszerzeń i znane ograniczenia nałożone na rozszerzenie przez system iOS. Omówiono tworzenie, dystrybucję, instalowanie i uruchamianie rozszerzeń oraz cykl życia rozszerzenia. Udostępniono przewodnik po utworzeniu prostego widżetu Today z dwoma sposobami tworzenia interfejsu użytkownika widżetu przy użyciu scenorysów lub kodu. Pokazano, jak przetestować rozszerzenie w symulatorze systemu iOS. Na koniec krótko omówiła komunikację z aplikacją hosta oraz kilka środków ostrożności i zagadnień, które należy wziąć pod uwagę podczas tworzenia rozszerzenia.


















