So verwenden Sie das Facebook iOS SDK unter iOS 10

104

Ich versuche, mit Xcode 8 eine App mit Facebook-Login mit Swift 3 zu erstellen. Wenn ich iOS Simulator 9.3 zurückschalte, funktioniert es. In iOS 10 erhalte ich folgende Fehlermeldung:

""fbauth2:/" The operation couldn’t be completed. (OSStatus error -10814.)"

und

Optional(Error Domain=com.facebook.sdk.login Code=308 "(null)")

Hat jemand eine Lösung dafür?

Anmerkung 1 :

Nach dem Debuggen ist dieses Problem FBSDK kann nicht aktualisiert werden expect_challange. Funktion im SecItemUpdateInneren funktioniert security.frameworknicht. Dies ist ein Problem von IOS 10

trquoccuong
quelle
5
"... warum erwartest du, dass das funktioniert?" Weil Software funktionieren sollte. Es ist nicht die Schuld dieses Typen, es ist nicht die Schuld von Facebook. Es ist Apples Schuld. Sie erhalten einen Pass, weil dies "Beta" ist, aber das Brechen des Schlüsselbunds ist selbst in der Beta nahezu inakzeptabel.
Jeff Holliday

Antworten:

201

Der Fehler OSStatus -10814 tritt auf, wenn canOpenURL: keine Anwendung gefunden werden kann, die diese URL öffnen kann (tatsächlich versucht Facebook, ihre Anwendung zu finden, indem es canOpenURL:mit dem Argument "fbauth2: /" aufruft). Das Drucken erfolgt innerhalb der Funktion, sodass Sie damit nichts anfangen können. Wenn Sie Ihre Anwendung jedoch auf einem Gerät mit installierter Facebook-App ausführen, wird dieser Fehler nicht angezeigt.

Fehler 308 tritt aufgrund der Situation auf, dass der im Schlüsselbund gespeicherte Wert nicht dem Wert entspricht, der in den Facebook-Abschlussparametern gespeichert ist (weitere Informationen können Sie überprüfen -[FBSDKLoginManager completeAuthentication:expectChallenge:]).

Dies liegt daran, dass Apple die Arbeitsweise mit dem Schlüsselbund in iOS 10 geändert hat. Um dieses Problem zu beheben, gehen Sie einfach zu Ziele-> Funktionen und aktivieren Sie die Schlüsselbundfreigabe (ermöglicht den Zugriff auf den Schlüsselbund für Ihre App): Bild

Wenn Sie Xamarin verwenden (lesen Sie diesen Link für weitere Informationen, danke @dynamokaj):

Stellen Sie einfach sicher, dass Sie den Schlüsselbundzugriff in Berechtigungen aktivieren, und wählen Sie auch die Berechtigungen für Simulator- (Debug-) Builds aus. Standardmäßig ist dies nicht eingestellt.

Roman Ermolov
quelle
2
Vielen Dank. Haben Sie ein Dokument über diese Änderung?
trquoccuong
1
Nach dem Beenden von xcode, dem Ausführen sudo xcode-select -switch /Applications/Xcode.app/Contents/Developerund dem Versuch, es neu zu erstellen, tritt immer noch das gleiche Problem auf. Ich erkenne jetzt, dass der Fehler, den ich sehe
Roy Kolak
1
@NikitaP Es scheint, dass Sie Erfahrung mit dem Problem haben, das @ RoyKolak oben erwähnt.
Roman Ermolov
1
@ NikitaP hat es herausgefunden. Es war eine Drittanbieter-Bibliothek (CleverTap), die versuchte, sich automatisch in den App-Delegaten zu integrieren. Ich antwortete in stackoverflow.com/questions/39091841/… Vielen Dank für Ihre Aufmerksamkeit!
Roy Kolak
3
@RomanErmolov Ich habe es herausgefunden, ich bin auf Xamarin und beim Erstellen für das Debuggen wird die Datei Entitlement.plist standardmäßig nicht verwendet. Als ich den Anspruch zum Debuggen einfügte, funktionierte es. Das Folgende gab mir den letzten Anstoß zu einer richtigen Lösung. stackoverflow.com/a/39576798/1062572 - Vielleicht könnten Sie Ihre Antwort aktualisieren, um es den Xamarin-Typen zu erleichtern, herauszufinden, ob sie fehlen.
Dynamokaj
5

Das gleiche Problem war in meiner App, ich habe viele Lösungen überprüft, aber es funktioniert nicht für mich. Ich habe dieses Problem mit der folgenden Methode behoben.

Gehen Sie zu diesem Link Wählen Sie Ihre App aus und konfigurieren Sie Ihreinfo.plist

import und fügen Sie diesen Code in Ihre AppDelegate

import FBSDKCoreKit
import FBSDKLoginKit

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
}

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, options: options)
}
ZAFAR007
quelle
4

Der Hauptgrund, warum Sie den folgenden Fehler erhalten,

canOpenURL: failed for URL: "fbauth2:/" - error: "The operation couldn’t be completed. (OSStatus error -10814.)

ist, dass auf Ihrem iOS-Simulator die Facebook-Anwendung nicht installiert ist. Bis Sie die Anwendung auf Ihrem iOS-Simulator installieren, wird der Fehler weiterhin angezeigt. Versuchen Sie, Ihre iOS-Anwendung auf einem bereitgestellten iOS-Gerät mit installiertem Facebook auszuführen, und die Fehlermeldung wird nicht erneut angezeigt. Hoffe das hilft!

umarqattan
quelle
Es sollte die Web-Benutzeroberfläche öffnen, wenn die fb-App nicht installiert ist.
Softlion
3

In meinem Fall war das Update *:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 

  // First, handle Facebook URL open request
  if let fbSDKAppId = FBSDKSettings.appID(), url.scheme!.hasPrefix("fb\(fbSDKAppId)"), url.host == "authorize" { 
    let shouldOpen: Bool = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 
    return shouldOpen 
  } 

  // After it, handle any other response (e.g. deep links)
  handlerOtherUrls(url: url) 
  return true 
}

* Wie von @MoridinBG auf der Github-Seite des Facebook SDK empfohlen

Ruben Marin
quelle
0

Dieser Fehler kann auch verursacht werden, wenn Sie FBSDKCoreKit oder FBSDKLoginKit Version 4.39.0 verwenden. In dieser Version des SDK ist ein Fehler aufgetreten. Aktualisieren Sie auf 4.39.1 oder höher, um das Problem zu beheben. Details hier .

Als Randnotiz erwähnten andere Benutzer, dass dieser Fehler auftritt, wenn Sie Facebook nicht auf dem Simulator installiert haben. Das stimmt, aber das SDK soll automatisch auf die Web-Anmeldemethode zurückgreifen, wenn die App nicht installiert ist. Wenn dies nicht der Fall ist, kann dies an einem anderen Problem liegen, z. B. an fehlenden / falsch konfigurierten Werten in Ihrer Info.plist (überprüfen Sie LSApplicationQueriesSchemes) oder an fehlenden Methoden in Ihrem AppDelegate.

Code Commander
quelle
-3

In meinem Fall war das Problem Google Analytics. Standardmäßig scheint es, dass es einen eigenen Ansichts-Controller über dem Ansichts-Controller der App hinzufügt. Das Setzen von "FirebaseAppDelegateProxyEnabled" auf "NO" in {Your app} -Info.plist hat das Problem behoben.

da1
quelle