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:
- Die Health Kit - und Event Kit-Ui-Frameworks 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 möglicherweise auf vorhandene Mediendateien zugreifen).
- 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 Mitglieder von UIApplication sind nicht verfügbar: UIApplication.SharedApplication, UIApplication.OpenUrl, UIApplication.BeginIgnoringInteractionEvents und UIApplication.EndIgnoringInteractionEvents
- iOS erzwingt eine Speicherauslastungsgrenze von 16 MB für die heutigen Erweiterungen.
- Tastaturerweiterungen haben standardmäßig 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, Netzwerkzugriff anzufordern, indem Sie den
Requests Open Access
Wert in der Info.plist des Projekts aufYes
festlegen. Weitere Informationen zu Einschränkungen der Tastaturerweiterung finden Sie im Apple Custom Keyboard Guide .
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:
- Erstellen Sie ein Anwendungspaket in der Releasekonfiguration .
- Legen Sie in den Projekteinstellungen für iOS-Build die Option Linker-Verhalten auf Nur Link Framework SDKs oder Alle verknüpfen fest.
- 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.ContainerApp
Erweiterung wie folgt aussehencom.myCompany.ContainerApp.MyExtension
:Er muss den Schlüssel
NSExtensionPointIdentifier
mit einem geeigneten Wert (zcom.apple.widget-extension
. B. für ein Widget heute Notification Center) in seinerInfo.plist
Datei definieren.Außerdem muss entweder der Schlüssel oder der
NSExtensionMainStoryboard
Schlüssel in derNSExtensionPrincipalClass
Info.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
). BeispielMain
: 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
übereinstimmen:
- Verwenden Sie den
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:
Erstellen der Lösung
Gehen Sie wie folgt vor, um die erforderliche Lösung zu erstellen:
Erstellen Sie zunächst ein neues iOS-Projekt, Single View App , 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 Projektname und Projektmappenname , 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 Today Extension 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 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:
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 per Vorlage hinzugefügt wurde, und geben Sie ihr den Namen
TodayMessage
auf der Registerkarte Widget der Eigenschaften Explorer: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 Projekt DaysRemaining aus, fügen Sie eine neue Klasse hinzu, und rufen Sie sie auf
CodeBasedViewController
:Doppelklicken Sie im Projektmappen-Explorer erneut auf die Datei der
Info.plist
Erweiterung, um sie zur Bearbeitung zu öffnen:Wählen Sie die Quellansicht (unten auf dem Bildschirm) 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 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:
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:
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 :
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:
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 UIViewController
gespeichert 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.