iOS 8 Freigabeerweiterung loadItemForTypeIdentifier: options: completionHandler: Abschluss wird nicht ausgeführt

9

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.

%Vor%

Der Abschnitt Info.plist NSExtension ist für Objective-C und Swift genau derselbe und sieht folgendermaßen aus:

%Vor%

Was mache ich falsch?

    
guptron 16.06.2014, 02:29
quelle

5 Antworten

10

rufen

auf %Vor%

am Ende der CompletionHandler, anstatt es am Ende von didSelectPost () aufzurufen

    
pJes2 14.10.2014 10:06
quelle
4

Ich nehme keine Anerkennung dafür, aber sehen Sie sich an, wie dieser Typ es gemacht hat: Ссылка

    
pauln 06.07.2014 18:56
quelle
3

Da completeRequestReturningItems aufgerufen werden muss, nachdem alle completionHandler zurückgerufen wurden, gehe ich wie folgt vor.

%Vor%     
hebinda 06.07.2015 06:03
quelle
0

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.

    
Dave Barker 26.09.2014 09:47
quelle
0

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:

%Vor%

Javascript Action.js Datei:

%Vor%

ActionRequestHandler.h Header-Datei:

%Vor%

ActionRequestHandler.m basierend auf der standardmäßigen Aktionserweiterungsvorlage:

%Vor%

Ich hoffe, es wird jemandem helfen, ein paar Stunden zu sparen, die mit dem completionHandler-Problem kämpfen.

    
xZenon 09.12.2014 21:38
quelle