Ich benutze die loadItemForTypeIdentifier: Optionen: completionHandler: Methode für ein NSItemProvider-Objekt, um eine URL aus Safari über eine Share-Erweiterung in iOS 8 zu extrahieren.
In Objective-C, dieser Code und funktioniert und der Block läuft.
%Vor% In Swift sieht es sehr ähnlich aus, aber die Schließung läuft nicht. Außerdem gibt itemProvider.hasItemConformingToTypeIdentifier("public.url")
YES
zurück, sodass ein gültiges Objekt vorhanden sein muss, um die URL innerhalb von itemProvider
zu analysieren.
Der Abschnitt Info.plist NSExtension ist für Objective-C und Swift genau derselbe und sieht folgendermaßen aus:
%Vor%Was mache ich falsch?
Ich habe in den letzten Wochen immer wieder mit diesem Thema gekämpft und endlich das Problem gefunden. Ich habe nichts mit Objective C oder Swift zu tun, es scheint nur ein Fehler in Apples Code zu sein.
Es scheint, dass (wie bei iOS 8.0) der Completion-Block nur aufgerufen wird, wenn Sie Ihre eigene UIViewController
-Unterklasse verwenden. Wenn Sie eine Unterklasse von SLComposeServiceViewController
verwenden, wird der Completion-Block nicht aufgerufen.
Das ist wirklich ärgerlich, da XCode standardmäßig ein ShareViewController
mit einer Unterklasse von SLComposeServiceViewController
erstellt. Um dieses Problem zu umgehen, müssen Sie ShareViewController ändern, um von UIViewController
zu erben. Dies wird immer noch den Zugriff auf die extensionContext
-Eigenschaft ermöglichen, aber Sie werden natürlich alle schönen Standardfunktionen verlieren und müssen Ihre UI von Grund auf neu implementieren.
Ich habe bei Apple einen Radar gemeldet, aber noch keine Antwort erhalten. Hoffentlich wird dies in einem zukünftigen Update behoben werden.
Ich habe nie geschafft, dass completionHandler für die Share-Erweiterung ohne Benutzerschnittstelle richtig funktioniert (in diesem Fall ist die Klasse der Erweiterung eine Unterklasse für NSObject).
Trotz der Rückkehr von [itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]
YES
wird der completionHandler niemals sowohl auf dem Gerät als auch auf dem Simulator aufgerufen.
Nachdem ich verschiedene Ansätze ausprobiert hatte, endete die Problemumgehung auf der Basis von Javascript, das die URL zurück an die Extension übergab (leider verwende ich ObjC nicht Swift für mein Beispiel).
Info.plist
NSExtensionsabschnitt:
Javascript Action.js
Datei:
ActionRequestHandler.h
Header-Datei:
ActionRequestHandler.m
basierend auf der standardmäßigen Aktionserweiterungsvorlage:
Ich hoffe, es wird jemandem helfen, ein paar Stunden zu sparen, die mit dem completionHandler-Problem kämpfen.
Tags und Links swift ios8 ios-app-extension share