iOS-Erweiterungen in Xamarin.iOS

Video zum Erstellen von Erweiterungen in iOS

Erweiterungen, wie in iOS 8 eingeführt, sind spezialisiert UIViewControllers , die von iOS in Standardkontexten, z. B. im Notification Center, als benutzerdefinierte Tastaturtypen präsentiert werden, die vom Benutzer angefordert werden, um spezielle Eingaben auszuführen, oder andere Kontexte wie das Bearbeiten eines Fotos, in dem die Erweiterung spezielle Effektfilter bereitstellen kann.

Alle Erweiterungen werden in Verbindung mit einer Container-App installiert (wobei beide Elemente mithilfe der 64-Bit-einheitlichen APIs geschrieben werden) und von einem bestimmten Erweiterungspunkt in einer Host-App aktiviert. Und da sie als Ergänzung zu bestehenden Systemfunktionen verwendet werden, müssen sie hochleistungs-, schlank und robust sein.

Erweiterungspunkte

Typ BESCHREIBUNG Erweiterungspunkt Host-App
Action 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 Photos.app Editor
Teilen Teilt Daten mit sozialen Netzwerken, Messagingdiensten usw. com.apple.share-services Any
Heute "Widgets", die auf dem Bildschirm "Heute" oder im Notification Center angezeigt werden com.apple.widget-extensions Heute und Notification Center

In iOS 10 und iOS 12 wurden zusätzliche Erweiterungspunkte hinzugefügt. Die vollständige Tabelle aller unterstützten Typen finden Sie im Programmierhandbuch für die iOS-App-Erweiterung.

Einschränkungen

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

Die universellen Einschränkungen sind:

Einzelne 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 die App Store übermittelt und verteilt wird. Die mit der App verteilten Erweiterungen werden zu diesem Zeitpunkt installiert, aber der Benutzer muss jede Erweiterung explizit aktivieren. Die verschiedenen Arten von Erweiterungen werden auf unterschiedliche Weise aktiviert. einige erfordern, dass der Benutzer zur Einstellungen-App navigiert und sie von dort aus aktiviert. Während andere zum Zeitpunkt der Verwendung aktiviert sind, z. B. die Aktivierung einer Freigabeerweiterung beim Senden eines Fotos.

Die App, in der die Erweiterung verwendet wird (bei der 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 es sich um die App handelt, die die Erweiterung bei der Installation enthielt.

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

Debuggen und Releaseversionen von Erweiterungen

Die Arbeitsspeichergrenzwerte für die Ausführung von App-Erweiterungen liegen deutlich unter den Arbeitsspeichergrenzwerten, die auf eine Vordergrund-App angewendet werden. Für Simulatoren, bei denen iOS ausgeführt wird, gelten weniger Einschränkungen für Erweiterungen, 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 eines Absturzes der Erweiterung oder einer 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 Erweiterungen angewendet werden, auf die verwiesen wird:

  1. Erstellen Sie ein Anwendungspaket in der Releasekonfiguration .
  2. Legen Sie in den Projekteinstellungen für iOS-Build die Option Linker-Verhalten auf Nur Link Framework SDKs oder Alle verknüpfen fest.
  3. Deaktivieren Sie in den Einstellungen des iOS-Debugprojekts die Option Debuggen aktivieren und Profilerstellung aktivieren .

Erweiterungslebenszyklus

Eine Erweiterung kann so einfach sein wie ein einzelner UIViewController oder komplexere Erweiterungen, die mehrere Bildschirme der Benutzeroberfläche darstellen. Wenn der Benutzer auf Erweiterungspunkte stößt (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 diese UIViewController instanziiert und beginnt mit dem normalen View Controller-Lebenszyklus. Im Gegensatz zu einer normalen App, die angehalten, aber in der Regel nicht beendet wird, wenn der Benutzer die Interaktion mit ihnen beendet, 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 für Hintergrundthreads ausgeführt, und die Erweiterung muss dies berücksichtigen. für instance mithilfe von NSObject.InvokeOnMainThread, wenn die Benutzeroberfläche aktualisiert werden soll. Weitere Informationen finden Sie weiter unten im Abschnitt Kommunikation mit der Host-App .

Erweiterungen und ihre Container-Apps können trotz der gemeinsamen Installation standardmäßig nicht kommunizieren. In einigen Fällen ist die Container-App im Wesentlichen ein leerer "Versandcontainer", dessen Zweck nach der Installation der Erweiterung erfüllt wird. Wenn die Umstände dies jedoch bestimmen, können die Container-App und die Erweiterung Ressourcen aus einem gemeinsamen Bereich gemeinsam nutzen. Darüber hinaus kann eine Today-Erweiterung ihre Container-App anfordern, um eine URL zu öffnen. Dieses Verhalten wird im Widget "Ereignis-Countdown" angezeigt.

Erstellen einer Erweiterung

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

Projektanforderungen für Container-Apps

Für die Container-App, die zum Installieren der Erweiterung verwendet wird, gelten die folgenden Anforderungen:

  • Es muss einen Verweis auf das Erweiterungsprojekt beibehalten.
  • Es muss eine vollständige App sein (muss in der Lage sein, erfolgreich zu starten und auszuführen), auch wenn sie nichts anderes als eine Möglichkeit zum Installieren einer Erweiterung bietet.
  • Es muss über einen Bundle-Bezeichner verfügen, der die Grundlage für den Bundle-Bezeichner des Erweiterungsprojekts ist (weitere Details finden Sie im abschnitt unten).

Erweiterungsprojektanforderungen

Darüber hinaus gelten für das Projekt der Erweiterung die folgenden Anforderungen:

  • Es muss über einen Bundle-Bezeichner verfügen, der mit dem Bundle-Bezeichner der Container-App beginnt. Wenn die Container-App beispielsweise über einen Bundle-Bezeichner von verfügt, kann der Bezeichner der com.myCompany.ContainerAppErweiterung wie folgt aussehen com.myCompany.ContainerApp.MyExtension:

    Bündelbezeichner

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

  • Außerdem muss entweder der Schlüssel oder der NSExtensionMainStoryboard Schlüssel in der NSExtensionPrincipalClassInfo.plist Datei mit einem entsprechenden Wert definiert werden:

    • Verwenden Sie den NSExtensionMainStoryboard Schlüssel, um den Namen des Storyboards anzugeben, das die Standard Ui für die Erweiterung darstellt (minus .storyboard). 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 UIViewControllerübereinstimmen:

    Prinzipalklassenregistrierung

Bestimmte Arten von Erweiterungen können zusätzliche Anforderungen haben. Für instance muss die Prinzipalklasse einer Today- oder Notification Center-ErweiterungINCWidgetProviding implementieren.

Wichtig

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

Exemplarische Vorgehensweise

In der folgenden exemplarischen Vorgehensweise erstellen Sie ein Heute-Beispielwidget, das den Tag und die Anzahl der verbleibenden Tage im Jahr berechnet:

Ein Heute-Beispielwidget, das den Tag und die Anzahl der verbleibenden Tage im Jahr berechnet.

Erstellen der Lösung

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

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

    Erstellen Sie zunächst ein neues iOS-Projekt mit single view App, und klicken Sie auf die Schaltfläche Weiter.

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

  3. Überprüfen Sie Projektname und Projektmappenname , 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 Erstellen, um die Projektmappe zu erstellen.

  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 Today Extension hinzu:

    Klicken Sie anschließend im Projektmappen-Explorer mit der rechten Maustaste auf die Projektmappe, und fügen Sie ein neues iOS-Erweiterungsprojekt aus der Vorlage Heute-Erweiterung hinzu.

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

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

  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 Erstellen, um es zu erstellen.

Die resultierende Projektmappe sollte nun über zwei Projekte verfügen, wie hier gezeigt:

Die resultierende Projektmappe sollte nun über zwei Projekte verfügen, wie hier gezeigt

Erstellen der Erweiterungs-Benutzeroberfläche

Als Nächstes müssen Sie die Benutzeroberfläche für Ihr Heute-Widget entwerfen. Dies kann entweder mithilfe eines Storyboards oder durch Erstellen der Benutzeroberfläche im Code erfolgen. Beide Methoden werden unten ausführlich 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 per Vorlage hinzugefügt wurde, und geben Sie ihr den NamenTodayMessage auf der Registerkarte Widget der Eigenschaften Explorer:

    Wählen Sie die Bezeichnung aus, die der Benutzeroberfläche automatisch per Vorlage hinzugefügt wurde, und geben Sie ihr den Namen TodayMessage auf der Registerkarte Widget des Explorer

  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 Projekt DaysRemaining aus, fügen Sie eine neue Klasse hinzu, und rufen Sie sie aufCodeBasedViewController:

    Aelect the DaysRemaining project, add a new class and call it CodeBasedViewController

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

    Doppelklicken Sie auf die Datei Erweiterungen Info.plist, um sie zur Bearbeitung zu öffnen.

  3. Wählen Sie die Quellansicht (unten auf dem Bildschirm) aus, und öffnen Sie den NSExtension Knoten:

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

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

    Entfernen Sie den NSExtensionMainStoryboard-Schlüssel, und fügen Sie eine NSExtensionPrincipalClass mit dem Wert CodeBasedViewController hinzu.

  5. Speichern Sie die Änderungen.

Bearbeiten Sie als Nächstes die CodeBasedViewController.cs Datei, und lassen Sie sie wie folgt aussehen:

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")] mit dem Wert übereinstimmt, den Sie für den NSExtensionPrincipalClass oben angegebenen Wert angegeben haben.

Codieren der Erweiterung

Wenn die Benutzeroberfläche erstellt wurde, öffnen Sie entweder die TodayViewController.cs Datei oder CodeBasedViewController.cs (basierend auf der Methode, die zum Erstellen der Benutzeroberfläche oben verwendet wurde), ä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 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 durch, um den Tag des Jahres und die verbleibende Anzahl von Tagen abzurufen. Anschließend wird die Meldung in der Bezeichnung (TodayMessage) angezeigt, die Sie im Ui-Design erstellt haben.

Beachten Sie, wie ähnlich dieser Prozess dem normalen Prozess beim Schreiben einer App ist. Eine Erweiterung hat den gleichen Lebenszyklus wie ein Ansichtscontroller UIViewController in einer App, mit der Ausnahme, dass Erweiterungen keine Hintergrundmodi aufweisen und nicht angehalten werden, wenn der Benutzer sie verwendet hat. Stattdessen werden Erweiterungen bei Bedarf wiederholt initialisiert und aufgehoben.

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 TodayContainer-Datei Main.storyboard , und fügen Sie Text hinzu, der die Funktion der Erweiterung und deren Installation definiert:

Bearbeiten Sie die Datei

Speichern Sie die Änderungen im Storyboard.

Testen der Erweiterung

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

Die Container Standard Ansicht werden angezeigt.

Klicken Sie als Nächstes im Simulator auf die Schaltfläche Start , 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 Start, wischen Sie vom oberen Bildschirmrand nach unten, um das Notification Center zu öffnen, wählen Sie die Registerkarte Heute aus, und klicken Sie auf die Schaltfläche Bearbeiten.

Fügen Sie der Ansicht Heute die DaysRemaining-Erweiterung hinzu, und klicken Sie auf die Schaltfläche Fertig:

Fügen Sie der Ansicht Heute die DaysRemaining-Erweiterung hinzu, und klicken Sie auf die Schaltfläche Fertig

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

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

Kommunikation mit der Host-App

Die oben erstellte Beispielerweiterung heute kommuniziert nicht mit der Host-App (Bildschirm Heute ). Andernfalls würde die ExtensionContext-Eigenschaft der TodayViewController -Klasse oder CodeBasedViewController verwendet.

Für Erweiterungen, die Daten von ihren Host-Apps empfangen, sind 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 unterscheiden, dass der Benutzer die Nutzung beendet oder abbricht. Dies wird über die CompleteRequest - und CancelRequest-Methoden der ExtensionContext-Eigenschaft an die Host-App zurückgemeldet.

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 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 die Definitionen von kUTType... Apple 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

Sehen Sie sich folgendes Beispiel an:

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 unserer Dokumentation zum Arbeiten mit Funktionen .

Vorsichtsmaßnahmen und Überlegungen

Erweiterungen verfügen über deutlich weniger Arbeitsspeicher als Apps. Es wird erwartet, dass sie schnell und mit minimalem Zugriff auf den Benutzer und die App, in der sie gehostet werden, funktionieren. Eine Erweiterung sollte jedoch auch eine charakteristische, nützliche Funktion für die verwendende App mit einer Branding-Benutzeroberfläche bieten, die es dem Benutzer ermöglicht, den Entwickler oder die Container-App der Erweiterung zu identifizieren, zu der er gehört.

Angesichts dieser strengen Anforderungen sollten Sie nur Erweiterungen bereitstellen, die gründlich getestet und auf Leistung und Arbeitsspeicherverbrauch optimiert wurden.

Zusammenfassung

Dieses Dokument behandelt Erweiterungen, deren Art, die Art der Erweiterungspunkte und die bekannten Einschränkungen, die einer Erweiterung durch iOS auferlegt werden. Es wurden das Erstellen, Verteilen, Installieren und Ausführen von Erweiterungen und der Lebenszyklus der Erweiterung erläutert. Es bot eine exemplarische Vorgehensweise zum Erstellen eines einfachen Today-Widgets, das zwei Möglichkeiten zum Erstellen der Benutzeroberfläche des Widgets mithilfe von Storyboards oder Code zeigt. Es wurde gezeigt, wie eine Erweiterung im iOS-Simulator getestet wird. Schließlich wurden kurz die Kommunikation mit der Host-App und einige Vorsichtsmaßnahmen und Überlegungen erläutert, die beim Entwickeln einer Erweiterung beachtet werden sollten.