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 |
Photos.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 festgelegtYes
wird. 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 Einstellungs-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:
- Erstellen Sie ein Anwendungspaket in der Releasekonfiguration .
- Legen Sie in den iOS-Buildprojekteinstellungen die Linker-Verhaltensoption auf "Nur Verknüpfen von Framework-SDKs" oder "Alle verknüpfen" fest.
- 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:
- Es muss einen Verweis auf das Erweiterungsprojekt beibehalten.
- 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.ContainerApp
der Erweiterung wie folgt seincom.myCompany.ContainerApp.MyExtension
:Er muss den Schlüssel
NSExtensionPointIdentifier
mit einem geeigneten Wert (zcom.apple.widget-extension
. B. für ein Heutiges Benachrichtigungscenter-Widget) in derInfo.plist
Datei definieren.Außerdem muss er entweder den Schlüssel oder den Schlüssel in der
Info.plist
NSExtensionPrincipalClass
Datei mit einem geeigneten Wert definierenNSExtensionMainStoryboard
:- Verwenden Sie den
NSExtensionMainStoryboard
Schlüssel, um den Namen des Storyboards anzugeben, das die Haupt-UI für die Erweiterung (minus.storyboard
) darstellt. Beispiel:Main
für dieMain.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 IhresUIViewController
Werts übereinstimmen:
- Verwenden Sie den
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 verbleibenden Tage im Jahr berechnet:
Erstellen der Lösung
Gehen Sie wie folgt vor, um die erforderliche Lösung zu erstellen:
Erstellen Sie zunächst ein neues iOS-, Einzelansicht-App-Projekt, und klicken Sie auf die Schaltfläche "Weiter":
Rufen Sie das Projekt
TodayContainer
auf, und klicken Sie auf die Schaltfläche "Weiter ":Überprüfen Sie den Projektnamen und den Projektmappennamen, und klicken Sie auf die Schaltfläche "Erstellen", um die Projektmappe zu erstellen:
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:
Rufen Sie das Projekt
DaysRemaining
auf, und klicken Sie auf die Schaltfläche "Weiter ":Überprüfen Sie das Projekt, und klicken Sie auf die Schaltfläche "Erstellen ", um es zu erstellen:
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:
Doppelklicken Sie im Projektmappen-Explorer auf die Datei des Erweiterungsprojekts
Main.storyboard
, um sie zur Bearbeitung zu öffnen:Wählen Sie die Bezeichnung aus, die der Benutzeroberfläche automatisch nach Vorlage hinzugefügt wurde, und geben Sie ihm den Namen
TodayMessage
auf der Registerkarte "Widget" des Eigenschaften-Explorers:Speichern Sie die Änderungen im Storyboard.
Verwenden von Code
Gehen Sie wie folgt vor, um die Benutzeroberfläche im Code zu erstellen:
Wählen Sie im Projektmappen-Explorer das DaysRemaining-Projekt aus, fügen Sie eine neue Klasse hinzu, und rufen Sie sie
CodeBasedViewController
auf:Doppelklicken Sie erneut in der Projektmappen-Explorer auf die Datei der Erweiterung
Info.plist
, um sie zur Bearbeitung zu öffnen:Wählen Sie die Quellansicht (vom unteren Rand des Bildschirms) aus, und öffnen Sie den
NSExtension
Knoten:Entfernen Sie den
NSExtensionMainStoryboard
Schlüssel, und fügen Sie einenNSExtensionPrincipalClass
mit dem WertCodeBasedViewController
hinzu: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.cs
CodeBasedViewController.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 und die Anzahl der verbleibenden Tage abzurufen. 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:
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 Hauptansicht des Containers wird 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 ":
Fügen Sie die Erweiterung "DaysRemaining " zur Ansicht "Heute " hinzu, und klicken Sie auf die Schaltfläche "Fertig ":
Das neue Widget wird der Ansicht "Heute " hinzugefügt, und die Ergebnisse werden angezeigt:
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 UIViewController
gespeichert 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.