Rozszerzenia systemu iOS na platformie Xamarin.iOS
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 Access
wartości w pliku Info.plist projektu naYes
wartość . 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.ContainerApp
pakietu , identyfikator rozszerzenia może mieć wartośćcom.myCompany.ContainerApp.MyExtension
:Musi zdefiniować klucz
NSExtensionPointIdentifier
z odpowiednią wartością (nacom.apple.widget-extension
przykład dla widżetu Centrum powiadomień dzisiaj ) w plikuInfo.plist
.Musi również zdefiniować
NSExtensionMainStoryboard
klucz lubNSExtensionPrincipalClass
klucz w plikuInfo.plist
z odpowiednią wartością:NSExtensionMainStoryboard
Użyj klucza, aby określić nazwę scenorysu, który przedstawia główny interfejs użytkownika rozszerzenia (minus.storyboard
). Na przykładMain
dlaMain.storyboard
pliku.NSExtensionPrincipalClass
Uż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
TodayContainer
i 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
DaysRemaining
i 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.storyboard
Rozszerzenia, aby otworzyć go do edycji:Wybierz etykietę, która została automatycznie dodana do interfejsu użytkownika według szablonu, i nadaj jej nazwę
TodayMessage
na 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
NSExtension
węzeł:NSExtensionMainStoryboard
Usuń klucz i dodaj elementNSExtensionPrincipalClass
z 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:
- Apple Watch Ustawienia.
- 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
-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
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.