iOS-Erweiterungen in Xamarin.iOS

Erstellen von Erweiterungen in iOS-Video

Erweiterungen, wie sie in iOS 8 eingeführt wurden, sind spezialisierte UIViewControllers, die von iOS in Standardkontexten wie der Mitteilungszentrale, als benutzerdefinierte Tastaturtypen, die von Benutzer*innen angefordert werden, um spezielle Eingaben vorzunehmen, oder in anderen Kontexten wie der Bearbeitung eines Fotos, wo die Erweiterung spezielle Effektfilter bereitstellen kann, präsentiert werden.

Alle Erweiterungen werden in Verbindung mit einer Container-App (mit beiden Elementen, die mit den 64-Bit-Unified-APIs geschrieben wurden) installiert und von einem bestimmten Erweiterungspunkt in einer Host-App aktiviert. Und da sie als Ergänzungen zu vorhandenen Systemfunktionen verwendet werden, müssen sie hochleistungsfähig, schlanke und robust sein.

Erweiterungspunkte

Typ Beschreibung Erweiterungspunkt Host-App
Aktion Spezialisierter Editor oder Viewer für einen bestimmten Medientyp com.apple.ui-services Any
Dokumentanbieter Ermöglicht der App die Verwendung eines Remotedokumentspeichers com.apple.fileprovider-ui Apps mit einem UIDocumentPickerViewController
Tastatur Alternative Tastaturen com.apple.keyboard-service Any
Fotobearbeitung Fotobearbeitung und -bearbeitung com.apple.photo-editing Fotos.app-Editor
Teilen Teilt Daten mit sozialen Netzwerken, Messagingdiensten usw. com.apple.share-services Any
Today "Widgets", die auf dem Bildschirm "Heute" oder im Benachrichtigungscenter angezeigt werden com.apple.widget-extensions Heute und Benachrichtigungscenter

Zusätzliche Erweiterungspunkte wurden in iOS 10 und iOS 12 hinzugefügt. Die vollständige Tabelle aller unterstützten Typen finden Sie im Programmierhandbuch zur iOS-App-Erweiterung.

Begrenzungen

Erweiterungen weisen eine Reihe von Einschränkungen auf, von denen einige für alle Typen universell sind (z. B. kein Erweiterungstyp kann auf die Kameras oder Mikrofone zugreifen), während andere Arten von Erweiterung möglicherweise bestimmte Einschränkungen für ihre Verwendung haben (z. B. können benutzerdefinierte Tastaturen nicht für sichere Dateneingabefelder wie für Kennwörter verwendet werden).

Die universellen Einschränkungen sind:

  • Die Ui-Frameworks für Das Health Kit und das Event Kit sind nicht verfügbar.
  • Erweiterungen können keine erweiterten Hintergrundmodi verwenden
  • Erweiterungen können nicht auf die Kameras oder Mikrofone des Geräts zugreifen (obwohl sie auf vorhandene Mediendateien zugreifen können)
  • Erweiterungen können Keine Air Drop-Daten empfangen (obwohl sie Daten über Air Drop übertragen können)
  • UIActionSheet und UIAlertView sind nicht verfügbar. Erweiterungen müssen UIAlertController verwenden
  • Mehrere Elemente von UIApplication sind nicht verfügbar: UIApplication.SharedApplication, UIApplication.OpenUrl, UIApplication.BeginIgnoringInteractionEvents und UIApplication.EndIgnoringInteractionEvents
  • iOS erzwingt einen Grenzwert von 16 MB Speicherauslastung für heutige Erweiterungen.
  • Standardmäßig haben Tastaturerweiterungen keinen Zugriff auf das Netzwerk. Dies wirkt sich auf das Debuggen auf dem Gerät aus (die Einschränkung wird im Simulator nicht erzwungen), da Xamarin.iOS Netzwerkzugriff erfordert, damit das Debuggen funktioniert. Es ist möglich, den Netzwerkzugriff anzufordern, indem der Requests Open Access Wert in der Info.plist des Projekts auf festgelegt Yeswird. Weitere Informationen zu Einschränkungen der Tastaturerweiterung finden Sie im Apple-Handbuch für benutzerdefinierte Tastaturerweiterungen.

Individuelle Einschränkungen finden Sie im Programmierhandbuch für die App-Erweiterung von Apple.

Verteilen, Installieren und Ausführen von Erweiterungen

Erweiterungen werden innerhalb einer Container-App verteilt, die wiederum über den App Store übermittelt und verteilt wird. Die mit der App verteilten Erweiterungen werden an diesem Punkt installiert, der Benutzer muss jedoch jede Erweiterung explizit aktivieren. Die verschiedenen Arten von Erweiterungen werden auf unterschiedliche Weise aktiviert; mehrere erfordern, dass der Benutzer zur Einstellungen-App navigiert und von dort aus aktiviert. Während andere am Zeitpunkt der Verwendung aktiviert sind, z. B. das Aktivieren einer Freigabeerweiterung beim Senden eines Fotos.

Die App, in der die Erweiterung verwendet wird (wo der Benutzer auf den Erweiterungspunkt trifft) wird als Host-App bezeichnet, da es sich um die App handelt, die die Erweiterung hostet, wenn sie ausgeführt wird. Die App, die die Erweiterung installiert, ist die Container-App, da sie die App ist, die die Erweiterung enthielt, als sie installiert wurde.

In der Regel beschreibt die Container-App die Erweiterung und führt den Benutzer durch den Prozess der Aktivierung.

Debuggen und Freigeben von Versionen von Erweiterungen

Speicherbeschränkungen für die Ausführung von App-Erweiterungen sind deutlich niedriger als die Speichergrenzwerte, die auf eine Vordergrund-App angewendet werden. Simulatoren, die iOS ausführen, haben weniger Einschränkungen, die auf Erweiterungen angewendet werden, und Sie können Ihre Erweiterung ohne Probleme ausführen. Das Ausführen derselben Erweiterung auf einem Gerät kann jedoch zu unerwarteten Ergebnissen führen, einschließlich des Absturzes der Erweiterung oder der aggressiven Beendigung durch das System. Stellen Sie daher sicher, dass Sie die Erweiterung auf einem Gerät erstellen und testen, bevor Sie sie versenden.

Stellen Sie sicher, dass die folgenden Einstellungen auf das Containerprojekt und alle referenzierten Erweiterungen angewendet werden:

  1. Erstellen Sie ein Anwendungspaket in der Releasekonfiguration .
  2. Legen Sie in den iOS-Buildprojekteinstellungen die Linker-Verhaltensoption auf "Nur Verknüpfen von Framework-SDKs" oder "Alle verknüpfen" fest.
  3. Deaktivieren Sie in den iOS-Debugprojekteinstellungen die Option "Debugging aktivieren" und "Profilerstellung aktivieren".

Erweiterungslebenszyklus

Eine Erweiterung kann so einfach wie ein einzelner UIViewController oder komplexere Erweiterungen sein, die mehrere Bildschirme der Benutzeroberfläche darstellen. Wenn der Benutzer auf eine Erweiterungspunkte trifft (z. B. beim Freigeben eines Bilds), hat er die Möglichkeit, aus den für diesen Erweiterungspunkt registrierten Erweiterungen auszuwählen.

Wenn sie eine der Erweiterungen Ihrer App auswählen, wird sie UIViewController instanziiert und beginnen den normalen View Controller-Lebenszyklus. Im Gegensatz zu einer normalen App, die angehalten, aber nicht allgemein beendet wird, wenn der Benutzer die Interaktion mit ihnen beendet hat, werden Erweiterungen geladen, ausgeführt und dann wiederholt beendet.

Erweiterungen können mit ihren Host-Apps über ein NSExtensionContext-Objekt kommunizieren. Einige Erweiterungen verfügen über Vorgänge, die asynchrone Rückrufe mit den Ergebnissen empfangen. Diese Rückrufe werden in Hintergrundthreads ausgeführt, und die Erweiterung muss dies berücksichtigen; Beispielsweise mithilfe von NSObject.InvokeOnMainThread , wenn sie die Benutzeroberfläche aktualisieren möchten. Weitere Informationen finden Sie im Abschnitt "Kommunikation mit der Host-App" weiter unten.

Standardmäßig können Erweiterungen und ihre Container-Apps nicht kommunizieren, obwohl sie zusammen installiert wurden. In einigen Fällen ist die Container-App im Wesentlichen ein leerer "Versandcontainer", dessen Zweck nach der Installation der Erweiterung bereitgestellt wird. Wenn jedoch die Umstände diktieren, können die Container-App und die Erweiterung Ressourcen aus einem gemeinsamen Bereich freigeben. Darüber hinaus kann eine Today-Erweiterung die Container-App anfordern, um eine URL zu öffnen. Dieses Verhalten wird im Ereignis-Countdown-Widget angezeigt.

Erstellen einer Erweiterung

Erweiterungen (und ihre Container-Apps) müssen 64-Bit-Binärdateien sein und mithilfe der Xamarin.iOS Unified-APIs erstellt werden. Beim Entwickeln einer Erweiterung enthalten Ihre Lösungen mindestens zwei Projekte: die Container-App und ein Projekt für jede Erweiterung, die der Container bereitstellt.

Anforderungen für Container-App-Projekte

Die Container-App, die zum Installieren der Erweiterung verwendet wird, hat die folgenden Anforderungen:

  • Sie muss einen Verweis auf das Erweiterungsprojekt Standard enthalten.
  • Es muss sich um eine vollständige App handeln (muss erfolgreich gestartet und ausgeführt werden können), auch wenn sie keine Möglichkeit zum Installieren einer Erweiterung bietet.
  • Er muss über einen Bündelbezeichner verfügen, der die Basis für den Bündelbezeichner des Erweiterungsprojekts ist (weitere Details finden Sie im folgenden Abschnitt).

Erweiterungsprojektanforderungen

Darüber hinaus hat das Projekt der Erweiterung die folgenden Anforderungen:

  • Er muss über einen Bundlebezeichner verfügen, der mit dem Bündelbezeichner der Container-App beginnt. Wenn die Container-App beispielsweise einen Bündelbezeichner aufweist, kann der Bezeichner com.myCompany.ContainerAppder Erweiterung wie folgt sein com.myCompany.ContainerApp.MyExtension:

    Bündelbezeichner

  • Er muss den Schlüssel NSExtensionPointIdentifiermit einem geeigneten Wert (z com.apple.widget-extension . B. für ein Heutiges Benachrichtigungscenter-Widget) in der Info.plist Datei definieren.

  • Außerdem muss er entweder den Schlüssel oder den Schlüssel in der Info.plistNSExtensionPrincipalClass Datei mit einem geeigneten Wert definierenNSExtensionMainStoryboard:

    • Verwenden Sie den NSExtensionMainStoryboard Schlüssel, um den Namen des Storyboards anzugeben, das die Standard UI für die Erweiterung (minus.storyboard) darstellt. Beispiel: Main für die Main.storyboard Datei.
    • Verwenden Sie den NSExtensionPrincipalClass Schlüssel, um die Klasse anzugeben, die beim Starten der Erweiterung initialisiert wird. Der Wert muss mit dem Registerwert Ihres UIViewControllerWerts übereinstimmen:

    Prinzipalklassenregistrierung

Bestimmte Arten von Erweiterungen können zusätzliche Anforderungen haben. Beispielsweise muss die Hauptklasse einer Today- oder Notification Center-Erweiterung INCWidgetProviding implementieren.

Wichtig

Wenn Sie Ihr Projekt mit einer der Erweiterungen-Vorlagen beginnen, die von Visual Studio für Mac bereitgestellt werden, werden die meisten (wenn nicht alle) diese Anforderungen für Sie automatisch von der Vorlage bereitgestellt und erfüllt.

Exemplarische Vorgehensweise

In der folgenden exemplarischen Vorgehensweise erstellen Sie ein Beispiel-Widget "Heute", das den Tag und die Anzahl der Tage neu berechnet Standard im Jahr:

Ein Beispiel für ein Heute-Widget, das den Tag und die Anzahl der Tage neu berechnet Standard im Jahr

Erstellen der Lösung

Gehen Sie wie folgt vor, um die erforderliche Lösung zu erstellen:

  1. Erstellen Sie zunächst ein neues iOS-, Einzelansicht-App-Projekt, und klicken Sie auf die Schaltfläche "Weiter":

    Erstellen Sie zunächst ein neues iOS-, Einzelansicht-App-Projekt, und klicken Sie auf die Schaltfläche

  2. Rufen Sie das Projekt TodayContainer auf, und klicken Sie auf die Schaltfläche "Weiter ":

    Rufen Sie das Projekt TodayContainer auf, und klicken Sie auf die Schaltfläche

  3. Überprüfen Sie den Projektnamen und den Projektmappennamen, und klicken Sie auf die Schaltfläche "Erstellen", um die Projektmappe zu erstellen:

    Überprüfen Sie den Projektnamen und den Projektmappennamen, und klicken Sie auf die Schaltfläche

  4. Klicken Sie als Nächstes im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und fügen Sie ein neues iOS-Erweiterungsprojekt aus der Vorlage "Heute Erweiterung" hinzu:

    Klicken Sie als Nächstes im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und fügen Sie ein neues iOS-Erweiterungsprojekt aus der Vorlage

  5. Rufen Sie das Projekt DaysRemaining auf, und klicken Sie auf die Schaltfläche "Weiter ":

    Rufen Sie das Projekt DaysRe Standard ing auf, und klicken Sie auf die Schaltfläche

  6. Überprüfen Sie das Projekt, und klicken Sie auf die Schaltfläche "Erstellen ", um es zu erstellen:

    Überprüfen Sie das Projekt, und klicken Sie auf die Schaltfläche

Die resultierende Lösung sollte nun über zwei Projekte verfügen, wie hier gezeigt:

Die resultierende Lösung sollte nun über zwei Projekte verfügen, wie hier gezeigt

Erstellen der Erweiterungs-Benutzeroberfläche

Als Nächstes müssen Sie die Schnittstelle für Ihr Heutiges Widget entwerfen. Dies kann entweder mithilfe eines Storyboards oder durch Erstellen der Benutzeroberfläche im Code erfolgen. Beide Methoden werden im Detail behandelt.

Verwenden von Storyboards

Gehen Sie wie folgt vor, um die Benutzeroberfläche mit einem Storyboard zu erstellen:

  1. Doppelklicken Sie im Projektmappen-Explorer auf die Datei des ErweiterungsprojektsMain.storyboard, um sie zur Bearbeitung zu öffnen:

    Doppelklicken Sie auf die Datei

  2. Wählen Sie die Bezeichnung aus, die der Benutzeroberfläche automatisch nach Vorlage hinzugefügt wurde, und geben Sie ihm den NamenTodayMessage auf der Registerkarte "Widget" des Eigenschaften-Explorers:

    Wählen Sie die Bezeichnung aus, die der Benutzeroberfläche automatisch nach Vorlage hinzugefügt wurde, und geben Sie ihm die

  3. Speichern Sie die Änderungen im Storyboard.

Verwenden von Code

Gehen Sie wie folgt vor, um die Benutzeroberfläche im Code zu erstellen:

  1. Wählen Sie im Projektmappen-Explorer das DaysRe Standard ing-Projekt aus, fügen Sie eine neue Klasse hinzu, und rufen Sie sie CodeBasedViewControllerauf:

    Aelect the DaysRe Standard ing project, add a new class and call it CodeBasedViewController

  2. Doppelklicken Sie erneut in der Projektmappen-Explorer auf die Datei der ErweiterungInfo.plist, um sie zur Bearbeitung zu öffnen:

    Doppelklicken Sie auf die Datei

  3. Wählen Sie die Quellansicht (vom unteren Rand des Bildschirms) aus, und öffnen Sie den NSExtension Knoten:

    Wählen Sie die Quellansicht unten auf dem Bildschirm aus, und öffnen Sie den Knoten

  4. Entfernen Sie den NSExtensionMainStoryboard Schlüssel, und fügen Sie einen NSExtensionPrincipalClass mit dem Wert CodeBasedViewControllerhinzu:

    Entfernen Sie den Schlüssel

  5. Speichern Sie die Änderungen.

Bearbeiten Sie als Nächstes die CodeBasedViewController.cs Datei, und stellen Sie sicher, dass sie wie folgt aussieht:

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

    }
  }
}

Beachten Sie, dass der [Register("CodeBasedViewController")] Wert, den Sie für die NSExtensionPrincipalClass oben angegebenen Werte angegeben haben, übereinstimmt.

Codieren der Erweiterung

Wenn die Benutzeroberfläche erstellt wurde, öffnen Sie entweder die Datei oder die TodayViewController.csCodeBasedViewController.cs Datei (basierend auf der oben verwendeten Methode zum Erstellen der Benutzeroberfläche), ändern Sie die ViewDidLoad-Methode , und lassen Sie sie wie folgt aussehen:

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);
  }
}

Wenn Sie die codebasierte Benutzeroberfläche-Methode verwenden, ersetzen Sie den // Insert code to power extension here... Kommentar durch den neuen Code von oben. Nach dem Aufrufen der Basisimplementierung (und Einfügen einer Bezeichnung für die codebasierte Version) führt dieser Code eine einfache Berechnung aus, um den Tag des Jahres abzurufen und wie viele Tage neu sind Standard ing. Anschließend wird die Meldung in der Beschriftung (TodayMessage) angezeigt, die Sie im Ui-Design erstellt haben.

Beachten Sie, wie ähnlich dieser Vorgang dem normalen Prozess zum Schreiben einer App ist. Die Erweiterung hat denselben Lebenszyklus wie ein Ansichtscontroller UIViewController in einer App, außer Erweiterungen verfügen nicht über Hintergrundmodi und werden nicht angehalten, wenn der Benutzer sie verwendet hat. Stattdessen werden Erweiterungen bei Bedarf wiederholt initialisiert und entteilt.

Erstellen der Benutzeroberfläche der Container-App

Für diese exemplarische Vorgehensweise wird die Container-App einfach als Methode zum Versenden und Installieren der Erweiterung verwendet und bietet keine eigenen Funktionen. Bearbeiten Sie die Datei "TodayContainer Main.storyboard ", und fügen Sie Text hinzu, der die Funktion der Erweiterung definiert und wie Sie ihn installieren:

Bearbeiten Sie die Datei

Speichern Sie die Änderungen im Storyboard.

Testen der Erweiterung

Führen Sie die TodayContainer-App aus, um Ihre Erweiterung im iOS-Simulator zu testen. Die Standard Ansicht des Containers wird angezeigt:

Die Container Standard Ansicht werden angezeigt.

Klicken Sie als Nächstes auf die Schaltfläche "Start " im Simulator, wischen Sie vom oberen Bildschirmrand nach unten, um das Benachrichtigungscenter zu öffnen, wählen Sie die Registerkarte "Heute " aus, und klicken Sie auf die Schaltfläche "Bearbeiten ":

Klicken Sie im Simulator auf die Schaltfläche

Fügen Sie die DaysRe Standard ing-Erweiterung zur Ansicht "Heute" hinzu, und klicken Sie auf die Schaltfläche "Fertig":

Fügen Sie

Das neue Widget wird der Ansicht "Heute " hinzugefügt, und die Ergebnisse werden angezeigt:

Das neue Widget wird der Ansicht

Kommunikation mit der Host-App

Das beispiel "Today Extension", das Sie oben erstellt haben, kommuniziert nicht mit der Host-App (dem Bildschirm "Heute "). Andernfalls wird die ExtensionContext-Eigenschaft der TodayViewController Klassen oder CodeBasedViewController Klassen verwendet.

Für Erweiterungen, die Daten von ihren Host-Apps empfangen, befinden sich die Daten in Form eines Arrays von NSExtensionItem-Objekten , die in der InputItems-Eigenschaft der ExtensionContext der Erweiterung UIViewControllergespeichert sind.

Andere Erweiterungen, z. B. Fotobearbeitungserweiterungen, können zwischen dem Benutzer unterscheiden, der die Nutzung abschließt oder abbricht. Dies wird über die CompleteRequest- und CancelRequest-Methoden der ExtensionContext-Eigenschaft an die Host-App zurückgesendet.

Weitere Informationen finden Sie im Programmierhandbuch für die App-Erweiterung von Apple.

Kommunikation mit der übergeordneten App

Durch eine App-Gruppe können unterschiedliche Anwendungen (oder eine Anwendung und ihre Erweiterungen) auf einen freigegebenen Dateispeicherort zugreifen. App-Gruppen können für folgende Daten verwendet werden:

Weitere Informationen finden Sie im Abschnitt "App-Gruppen " in unserer Dokumentation zum Arbeiten mit Funktionen .

MobileCoreServices

Verwenden Sie beim Arbeiten mit Erweiterungen einen Uniform Type Identifier (UTI), um Daten zu erstellen und zu bearbeiten, die zwischen der App, anderen Apps und/oder Diensten ausgetauscht werden.

Die MobileCoreServices.UTType statische Klasse definiert die folgenden Hilfseigenschaften, die sich auf apple-Definitionen kUTType... beziehen:

  • 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

Siehe folgendes Beispiel:

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");
    }
});

Weitere Informationen finden Sie im Abschnitt "App-Gruppen " in unserer Dokumentation zum Arbeiten mit Funktionen .

Vorsichtsmaßnahmen und Überlegungen

Erweiterungen haben deutlich weniger Arbeitsspeicher zur Verfügung als Apps. Es wird erwartet, dass sie schnell und mit minimalem Angriff auf den Benutzer und die App, in der sie gehostet werden, ausgeführt werden. Eine Erweiterung sollte jedoch auch eine unverwechselbare, nützliche Funktion für die verbrauchende App mit einer Branding-UI bereitstellen, mit der der Benutzer die Entwickler- oder Container-App der Erweiterung identifizieren kann, zu denen sie gehören.

Angesichts dieser engen Anforderung sollten Sie nur Erweiterungen bereitstellen, die gründlich getestet und für die Leistung und den Arbeitsspeicherverbrauch optimiert wurden.

Zusammenfassung

Dieses Dokument enthält Erweiterungen, was sie sind, die Art der Erweiterungspunkte und die bekannten Einschränkungen, die für eine Erweiterung durch iOS auferlegt wurden. Es wurde erläutert, wie Erweiterungen erstellt, verteilt, installiert und ausgeführt werden, und der Erweiterungslebenszyklus. Es wurde eine exemplarische Vorgehensweise zum Erstellen eines einfachen Heute-Widgets mit zwei Möglichkeiten zum Erstellen der Benutzeroberfläche des Widgets mithilfe von Storyboards oder Code bereitgestellt. Es zeigte, wie eine Erweiterung im iOS Simulator getestet wird. Schließlich wurde kurz über die Kommunikation mit der Host-App und einige Vorsichtsmaßnahmen und Überlegungen diskutiert, die bei der Entwicklung einer Erweiterung getroffen werden sollten.