it-swarm.com.de

Warum bekomme ich com.facebook.sdk.login Fehler 308?

Ich verwende Xcode 7.0, teste auf iOS 9.0.2 und verwende das Facebook SDK 4.7.0.

Wenn ich mich bei einem Benutzer anmelde, funktioniert meistens alles wie vorgesehen, manchmal bekomme ich diesen Fehler und ich habe keine Ahnung, warum! 

Die Operation konnte nicht abgeschlossen werden. (com.facebook.sdk.login Fehler 308.)

Nach Recherchen habe ich gesehen, dass einige Leute den Fehler erhalten, wenn sie sich gleichzeitig mit parse.coms FBUtils und der offiziellen FBSDK anmelden. Ich verwende jedoch nur FBSDK in meinem Projekt. 

Meine Frage ist also, warum erhalte ich diesen Fehler und wie kann ich ihn beseitigen?

Bearbeiten - Code hinzufügen

Hier ist meine Login-Logik:

func loginWithFacebook(sender: UIViewController, completion: (profile: FBSDKProfile?, token: String?, cancelled: Bool, error: String?) -> Void ) {

    FBSDKProfile.enableUpdatesOnAccessTokenChange(true)
    NSNotificationCenter.defaultCenter().addObserver( sender , selector: "onProfileUpdated:", name:FBSDKProfileDidChangeNotification, object: nil)
    let loginManager = FBSDKLoginManager()
    loginManager.logInWithReadPermissions(["email", "public_profile"], fromViewController: sender) { (result: FBSDKLoginManagerLoginResult!, error: NSError!) -> Void in
        if error != nil {
            print("ERROR")
            completion(profile: nil, token: nil, cancelled: false, error: error.localizedDescription)
            print(error.localizedDescription)

        } else if result.isCancelled {
            print("CANCELLED")
            completion(profile: nil, token: nil, cancelled: true, error: nil)

        } else {
            print("NO ERROR")
            if FBSDKProfile.currentProfile() == nil {
                print("PROFILE IS NIL")
                completion(profile: nil, token: result.token.tokenString, cancelled: false, error: nil)
            } else {
                print("PROFILE IS NOT NIL")
                completion(profile: FBSDKProfile.currentProfile(), token: result.token.tokenString, cancelled: false, error: nil)
            }

        }

    }
}
25
Swinny89

Für Xcode8 - iOS10

Enable Keychain-Freigabe auf der Registerkarte "Fähigkeiten" des Ziels behebte mein Problem.

 enter image description here

Weitere Details finden Sie hier: https://github.com/facebook/facebook-sdk-Swift/issues/51


Für Xamarin Studio (Vorgeschlagen von @Kenneth)

Fügen Sie die Datei Entitlements.plist unter Custom Entitlements unter den iOS Bundle Signing-Optionen des iOS-Projekts hinzu.

99
Zaid Pathan

Ich habe die Lösung für dieses Problem gefunden. Ich habe eine Instanz des Login-Managers erstellt, wo ich sie brauchte:

let loginManager = FBSDKLoginManager()

Dann benutzte ich es, um mich anzumelden, und ich erstellte eine weitere Instanz in meiner Logout-Methode. Ich habe das Problem behoben, indem ich eine Lazy-Variable erstellt habe, die in der App verwendet werden kann:

lazy var fbLoginManager: FBSDKLoginManager = {
   return FBSDKLoginManager()
}()

UPDATE

Facebook ist sich des Fehlers bewusst und untersucht ihn. Ich habe festgestellt, dass meine Lösung nicht immer funktioniert. Ich habe meinen Code folgendermaßen aktualisiert und habe ihn seitdem nicht gesehen:

private var _fbLoginManager: FBSDKLoginManager?

var fbLoginManager: FBSDKLoginManager {
    get {
        if _fbLoginManager == nil {
            _fbLoginManager = FBSDKLoginManager()
        }
        return _fbLoginManager!
    }
}

Wenn Sie sich von Facebook abmelden, müssen Sie _fbLoginManager = nil aufrufen. Die Instanz wird bei der nächsten Anmeldung erneut erstellt. Das Problem scheint häufiger aufzutreten, wenn dieselbe Instanz nach dem Abmelden erneut zum Anmelden verwendet wird. Das Problem tritt jedoch noch mehr auf, wenn es mehrere Instanzen von FBSDKLoginManager gibt. Wenn Sie es wie oben angegeben deklarieren, scheint das Problem jedoch behoben zu sein.

11
Swinny89

Oktober 2018. 

Grund: Das "+" - Zeichen wird in der ChallengeReceived-Zeichenfolge durch "" ersetzt. Ausgabe in FBSDK. 

Schnelle und schmutzige Lösung: https://github.com/facebook/facebook-objc-sdk/pull/922

Ersetzen Sie insbesondere Zeile 233 in FBSDKLoginManager:

NSString *challengeExpected = [self loadExpectedChallenge];

mit 

NSString *challengeExpected = [[self loadExpectedChallenge] stringByReplacingOccurrencesOfString:@"+" withString:@" "];
5
Renatus
1
Rao

Sieht aus, als wäre das Problem mit 4.9.0 gelöst. Ich hatte das gleiche Problem und es wurde mit der neuen SDK-Version behoben.
https://developers.facebook.com/docs/ios/change-log-4.x

1
code_ada

Stellen Sie sicher, dass Sie abgemeldet sind, bevor Sie erneut versuchen, sich anzumelden

let loginManager = LoginManager()
loginManager.logOut()
loginManager.logIn(readPermissions: [.email, .publicProfile,
0
Amr Mohamed

Ich hatte auch diesen Fehler, der Grund war in meinem Fall: AuthentificationController, auf dem sich der Facebook-Login-Button ohne Navigationscontroller befand. Um diesen Fehler zu beheben, habe ich nur den Navigationscontroller hinzugefügt und meinen Authentifizierungscontroller als root gesetzt.

0