2016-04-12 3 views
1

Ich versuche, Daten mit NSURLSession mit einer Hintergrundaufgabe von einer OSX-Freigabe-Erweiterung zu laden.NSURLSession mit Freigabeerweiterung gibt -995 auf OSX

Sobald ich die Aufgabe zu starten, wird von Delegierten mit der am wenigsten hilfreichen Fehlermeldung der Welt ruft zurück:

The operation couldn’t be completed. (NSURLErrorDomain error -995.) 

sind Es gibt keine andere Informationen in dem NSError Objekt, noch in der Konsole.

Nach Scheuern im Internet, der einzige Hinweis, ich habe, ist sicher zu stellen, dass ich die configuration.sharedContainerIdentifier richtig eingerichtet haben, aber ich habe bereits getan:

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(uniqueId) 
configuration.sharedContainerIdentifier = Config.appGroupName 
urlSession = NSURLSession.init(configuration: configuration, delegate: self, delegateQueue: nil) 

ich dann die Anforderung vorbereiten und erstellen die Aufgabe:

let task = self.urlSession!.dataTaskWithRequest(request) 
self.tasks.append(task) 
task.resume() 

Beachten Sie, dass alles funktioniert, wenn aus meiner Haupt-App. Es ist nur die Freigabeerweiterung, die fehlschlägt.

Welche anderen Probleme könnten den Fehler -995 verursachen?

+0

Wie wäre es mit [dieser Frage] (http://stackoverflow.com/questions/26172783/upload-nsurlssesssion-bedeutet-invalidated-in-sharing-extension-in-ios8-with-error)? – trojanfoe

+0

Das sagt mir nur, die 'sharedContainerIdentifier' , die ich bereits gesagt habe, dass ich getan habe. – tarmes

+0

Einen Fehler mit Apple einreichen. Dieser Fehlercode sollte dokumentiert werden und ist nicht. Nur jemand bei Apple kann Ihnen sagen, was es wahrscheinlich bedeutet, es sei denn, jemand ist gerade zufällig darüber gestolpert. – dgatwood

Antwort

1

(Bär mit mir, ich habe nicht rep noch für einen Kommentar, damit ich antworten müssen, und unbeschadet der Möglichkeit, haben Sie einen Fehler gefunden, den letzten Teil ich hinzufüge, könnte anderen helfen)

Wenn Sie eine NSURLSession verwenden, wird bei jedem Hintergrund-Upload/Download, der abgeschlossen wird, Ihre Hauptanwendung gestartet. Dies ist detailliert in der Common Scenarios Seite.

Wie Sie zeigen, was Sie getan haben, müssen Sie die NSURLSessionConfiguration mit einem sharedContainerIdentifier setzen:

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(uniqueId) 
configuration.sharedContainerIdentifier = Config.appGroupName 
urlSession = NSURLSession.init(configuration: configuration, delegate: self, delegateQueue: nil) 

Sie müssen, dass Ihre App sowohl Erweiterung und Ihre Haupt-App, um sicherzustellen, auch alle Triple-geprüft in der sind 'App Groups' Option in Xcode (ich betrachte Xcode 8.1), was bedeutet: (! )

  • die App Gruppenname ist der gleiche für beide App und Erweiterung
  • Check neben Add the App Group entitlements in the entitlement file
  • Check neben Add the App Groups feature to your App ID
  • Check neben Add App Groups to your App ID

Und die Kontrollen müssen da sein, auf sowohl App und Erweiterung.

Ich bin ein bisschen rostig beim Hinzufügen dieser, aber meine Erinnerung ist diese sind nicht in der richtigen Reihenfolge, z. Sie müssen "App-Gruppen zu Ihrer ID hinzufügen", bevor Sie sie sowohl in der App als auch in der Erweiterung überprüfen können, aber ich könnte falsch liegen.

Erweitert - Third-Party-Bibliotheken in App-Erweiterungen.

Mit Blick auf die GitHub Projekt nst/STTwitter, einem Dritt Twitter REST-Bibliothek, sie needed to add eine konfigurierbare Gruppen-ID die Gruppen-ID des NSURLSessionConfigurationsharedContainerIdentifier in die Bibliothek Benutzereinstellung zu ermöglichen.

Ich kann wieder falsch sein, aber das scheint wie wäre es ein allgemeines Problem bei der Verwendung von Third Party-Bibliotheken in einer App-Erweiterung - z. Ich bin gerade auf diesen Fehler gestoßen, als ich versuchte, das ChromeCast SDK zu verwenden, und dies könnte der Kick in den Hosen sein.

+0

Was ist Config.appGroupName hier? – jrwren

+1

Im Allgemeinen ist dies eine Gruppenkennung, mit der Sie die verschiedenen Codebasen programmatisch verknüpfen. Z.B. Wenn Sie über eine Erweiterung verfügen, die eine Zeile zu einer Datenbank hinzufügt, die Sie dann in Ihrer App lesen, müssen beide denselben appGroupName sowie App-Gruppen aktiviert haben. –

+1

Speziell im Fall der Erweiterung/des Downloads wird ein Download an diesen AppGroup-Bezeichner delegiert und mit Ihrer App statt Ihrer Erweiterung abgewickelt. Dies ist notwendig, da Ihre Erweiterung und Apps unterschiedliche Lebenszyklen haben und Erweiterungen sowohl einfacher als auch mit größerer Wahrscheinlichkeit beendet werden. –