Udostępnij za pośrednictwem


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:

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ń:

  1. Skompiluj pakiet aplikacji w konfiguracji wydania .
  2. W ustawieniach projektu kompilacji systemu iOS ustaw opcję Zachowanie konsolidatora na Opcję Połącz tylko zestawy SDK struktury lub Połącz wszystkie.
  3. 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:

    Identyfikatory pakietów

  • Musi zdefiniować klucz NSExtensionPointIdentifierz odpowiednią wartością (na com.apple.widget-extension przykład dla widżetu Centrum powiadomień dzisiaj ) w pliku Info.plist .

  • Musi również zdefiniować NSExtensionMainStoryboard klucz lub NSExtensionPrincipalClass klucz w pliku Info.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ład Main dla Main.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 elementu UIViewController:

    Rejestracja klasy głównej

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:

Przykładowy widżet Dzisiaj, 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:

  1. Najpierw utwórz nowy projekt aplikacji dla systemu iOS, Single View i kliknij przycisk Dalej :

    Najpierw utwórz nowy projekt aplikacji z systemem iOS, single view i kliknij przycisk Dalej

  2. Wywołaj projekt TodayContainer i kliknij przycisk Dalej :

    Wywołaj projekt TodayContainer i kliknij przycisk Dalej

  3. Sprawdź nazwę projektu i nazwę rozwiązania, a następnie kliknij przycisk Utwórz, aby utworzyć rozwiązanie:

    Sprawdź nazwę projektu i nazwę rozwiązania, a następnie kliknij przycisk Utwórz, aby utworzyć rozwiązanie

  4. 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):

    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)

  5. Wywołaj projekt DaysRemaining i kliknij przycisk Dalej :

    Wywołaj projekt DaysRemaining i kliknij przycisk Dalej

  6. Przejrzyj projekt i kliknij przycisk Utwórz , aby go utworzyć:

    Przejrzyj projekt i kliknij przycisk Utwórz, aby go utworzyć

Wynikowe rozwiązanie powinno teraz mieć dwa projekty, jak pokazano poniżej:

Wynikowe rozwiązanie powinno teraz mieć dwa projekty, jak pokazano tutaj

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:

  1. W Eksplorator rozwiązań kliknij dwukrotnie plik projektu Main.storyboard Rozszerzenia, aby otworzyć go do edycji:

    Kliknij dwukrotnie plik Main.storyboard projektów rozszerzeń, aby otworzyć go do edycji

  2. 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:

    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

  3. Zapisz zmiany w scenorysie.

Korzystanie z kodu

Aby skompilować interfejs użytkownika w kodzie, wykonaj następujące czynności:

  1. W Eksplorator rozwiązań wybierz projekt DaysRemaining, dodaj nową klasę i wywołaj ją CodeBasedViewController:

    Aelect projektu DaysRemaining, dodaj nową klasę i wywołaj ją CodeBasedViewController

  2. Ponownie w Eksplorator rozwiązań kliknij dwukrotnie plik rozszerzeniaInfo.plist, aby otworzyć go do edycji:

    Kliknij dwukrotnie plik Info.plist rozszerzeń, aby otworzyć go do edycji

  3. Wybierz widok źródła (w dolnej części ekranu) i otwórz NSExtension węzeł:

    Wybierz widok źródłowy w dolnej części ekranu i otwórz węzeł NSExtension

  4. NSExtensionMainStoryboard Usuń klucz i dodaj element NSExtensionPrincipalClass z wartością CodeBasedViewController:

    Usuń klucz NSExtensionMainStoryboard i dodaj NSExtensionPrincipalClass z wartością CodeBasedViewController

  5. 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:

Edytuj plik TodayContainers Main.storyboard i dodaj tekst definiujący funkcję Extensions 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:

Zostanie wyświetlony widok główny kontenerów

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 :

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:

Dodaj rozszerzenie DaysRemaining do widoku Dzisiaj i kliknij przycisk Gotowe

Nowy widżet zostanie dodany do widoku Dzisiaj , a wyniki zostaną wyświetlone:

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:

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.