wake-up-neo.com

iOS Parse Facebook Login Fehler 308 FBSDKLoginBadChallengeString

Ich versuche, die Facebook-Anmeldung mithilfe von Parse in meiner iOS-App zu implementieren. 

let permissionsArray = ["public_profile", "email"]

PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
    { (user: PFUser?, error: NSError?) in

    if let user = user {
        //we logged in!
    }
    else {
        //login error!
    }
}

Dies funktioniert gut im Simulator, aber nicht auf dem Gerät. Auf dem Gerät erhalte ich folgende Fehlermeldung:

Fehler Domain = com.facebook.sdk.login Code = 308 "Der Vorgang konnte nicht abgeschlossen werden. (Com.facebook.sdk.login Fehler 308.)

Fehlercode 308 gilt für FBSDKLoginBadChallengeString . "Bei der Anmeldereaktion fehlte eine gültige Abfragezeichenfolge."

Nachdem ich meine App auf Facebook autorisiert habe, wird dies aufgerufen:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

Die URL ist: 

fb1640722449492705://authorize/#state=%7B%22challenge%22%3A%225OKWv3wN%2BEH%2BeQu48Xv6ty%2BRuek%3D%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A1%2C%220_auth_logger_id%22%3A%22564CD915-2CFC-4989-9AF6-CEA389908D51%22%7D&granted_scopes=user_birthday%2Cpublic_profile&denied_scopes=&signed_request=c8SBBDeaNpF-R_XTYx4LRA0BWm5p9IwXDr8M4nL3YXI.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImNvZGUiOiJBUURhTXJibGw4Q3dITkd5M0xnQmNkVTNuYWRkeEVoTU5mMmx3eFpZU2IwZl9SU284YXhZdXZaRS02RnA2bU5Cdy1CWkVoRmt2Zk1xX1AxSHltUG00aWhkWE9hYmlvWFBiMnpCYkVnR1RRX3lzZVFIZXdHU19OcmpkNUF6WGtob1dfVE4wTmRrSGk5MzY0V2hFWUJDV0dfcE16RXpQVExHWE13X1dzb0QzZGtITm5fM0tHNjFxUjJyM3RDWVlNQTE4WENpS1dXTHUyM2dIRVhmTXc3ZTQ0M2xDQUtGRl9KSXcyVk1sS01FOTQ4dHQ2U1Fqb0tlVkp4RmJNSEFsWDZFYWxlUnQ2aGRrTGZlU2xuVTV5VjZ1bFhldHkxeEV5RmRDZVFHb2RXQ0dULVVCd3QyM0haY0dxNk8zbnE1cDRNWjNFZ012U2JhSGZyMmF6Wm8xUXk2X2xSQVNWcFlMVDZUdU5wZnMwVkJqNEdSaFEiLCJpc3N1ZWRfYXQiOjE0MzM0MTg2MDksInVzZXJfaWQiOiIxNDM3MzM0ODk5OTIwNDA5In0&access_token=CAAXUOnbG6uEBANtAd9DzWBSu4LLOEcPsu86Ny0Ir

Ja, ich habe alles in Parse's Facebook-Login-Guide verfolgt (sichergestellt, dass alle Bundle-IDs übereinstimmen, alle erforderlichen AppDelegate-Methoden implementiert usw.). 

Was genau bedeutet dieser Fehler und wie lösen Sie ihn?

43
Eric

Behoben. Dieses Problem wurde durch die Anmeldung mit Parse und mit FBSDKLoginButton verursacht.

Folgendes habe ich gemacht:

//in my UI setup code:
let fbLoginButton = FBSDKLoginButton()
fbLoginButton.addTarget(self, action: "fbButtonTouched:", forControlEvents: UIControlEvents.TouchUpInside)

....

func fbButtonTouched() {
    let permissionsArray = ["public_profile", "email"]

    PFFacebookUtils.logInInBackgroundWithReadPermissions(permissionsArray)
        { (user: PFUser?, error: NSError?) in

            if let user = user {
                //we logged in!
            }
            else {
                //login error!
            }
    }
}

Ich habe herausgefunden (auf die harte Tour), dass Tapping eine FBSDKLoginButton versucht, den Benutzer anzumelden! Es war nicht notwendig, den Benutzer auch mit PFFacebookUtils.logInInBackgroundWithReadPermissions anzumelden. Also habe ich gerade fbButtonTouched() losgelassen und konnte mich glücklich einloggen. 

Was also passierte, war, dass ich zwei Anmeldungen gleichzeitig versuchte, womit der Simulator zufrieden war, nicht aber das Gerät.

Wenn Sie wissen möchten, warum, liegt dies daran, dass die angeforderte Anmeldeauthentifizierungsherausforderung nicht der erwarteten entsprach weil sie die Anmeldung beim ersten Anmeldeversuch erhalten hat, nachdem sie die zweite Anmeldung gesendet hat versuchte und wartete daher auf die Authentifizierungsaufforderung des zweiten Anmeldeversuchs. 

Die Dokumentation für FBSDKLoginButton erwähnt derzeit irgendetwas nicht darüber, dass durch Antippen der Anmeldevorgang ausgelöst wird. Da es sich um eine Unterklasse von UIButton handelt, sollten Sie addTarget denken und implementieren Sie den Login-Fluss selbst. Und wenn Sie zwei Anmeldungen gleichzeitig haben, führt dies zu einer irreführenden FBSDKLoginBadChallengeString. Rezept für eine Katastrophe...

EDIT: Die Dokumentation wurde entsprechend aktualisiert:

FBSDKLoginButton arbeitet mit [FBSDKAccessToken currentAccessToken] zusammen, um zu bestimmen, was angezeigt werden soll, und startet automatisch die Authentifizierung, wenn Sie angetippt werden (d. h. Sie müssen Aktionsziele nicht manuell abonnieren).

(mein Schwerpunkt)

11
Eric

Eine einfache Lösung für mich. Aktivieren Sie einfach die Schlüsselbundfreigabe in Funktionen 

 Enable Keychain Sharing

49
Cuong Lam

Ich habe die Problemumgehung von totvos und seine Arbeitsweise mit FBSDKLoginKit 4.7.1 & FBSDKCoreKit 4.8 für mich verfolgt:

Problemumgehung ... Laden Sie die App auf das Telefon, und starten Sie sie die App vom Gerät (nicht vom Debugger). Fügen Sie dann den Debugger an zum laufenden Prozess. Dies scheint das Timingproblem zu umgehen bricht dies, und die verschiedenen Schlüsselbundoperationen scheinen zu funktionieren korrekt beim Debuggen.

Referenz: https://forums.developer.Apple.com/thread/4743#85335


Aktualisieren:

Diese Problemumgehung hat nicht die ganze Zeit funktioniert, also habe ich oben die Antwort von @ coco verwendet: https://stackoverflow.com/a/31480026/877225

15
ObjSal

Ich habe diesen Fehler erst gesehen, als ich mich abgemeldet und wieder angemeldet habe. 

Mein Anmelde- und Abmeldecode befand sich in verschiedenen Dateien, da die relevanten Benutzeroberflächen für An- und Abmeldung völlig unterschiedlich sind und ich zwei separate FBSDKLoginManager-Instanzen instanziiert hatte. Die Konsolidierung auf nur eine Instanz löste das Problem für mich.

15
loudmouth

Anscheinend war die einzige Lösung, die für mich funktionierte, das Hinzufügen der Schlüsselbundberechtigung für das Ziel. 

Sie finden es unter Projektname-> Zielname-> Fähigkeiten-> Schlüsselbundfreigabe

15
Lolloz89

Ich habe dieses Problem gefunden, als ich auf ein Upgrade aufgerüstet habe:

FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.

Es ging weg, als ich zu:

FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0

Ich hatte keine Gelegenheit herauszufinden, an welchem ​​Punkt die Aktualisierungen dies verursachen. Könnte ich beispielsweise bei allen drei Versionen mit 4.3.0 bleiben?

14
coco

Führen Sie Ihre App direkt von Ihrem Gerät aus aus, ohne sie von Ihrem Xcode aus starten zu müssen. Melden Sie sich dann bei Facebook an, ohne von 308 gestört zu werden. Danach können Sie den Start von Xcode auf Ihr Gerät fortsetzen, ohne dasselbe Problem auftritt.

Dies scheint ein Problem zwischen dem FB SDK und iOS zu sein und steht nicht in Zusammenhang mit Parse. Ich würde es schätzen, wenn uns jemand zu diesem Thema aufklären könnte.

Die Version meines Xcodes ist 7.1, das FB SDK ist 4.8.x.

8
MkVal

Ich benutze

pod 'FBSDKCoreKit', '~> 4.8.0'
pod 'FBSDKLoginKit', '~> 4.8.0'
pod 'FBSDKShareKit', '~> 4.8.0'

... und hatte das code 308-Problem, wenn ich mich während derselben Sitzung abgemeldet habe. Die Verwendung von [[FBSDKLoginManager alloc] logOut] oder [facebookLoginManager logOut] (mit einem persistenten Manager) vor dem Aufruf von logInWithReadPermissions: hat nicht funktioniert, aber das Hinzufügen

[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];

bevor der logInWithReadPermissions:-Aufruf funktioniert (In iOS 9.2 getestet.)

7

Vor dem Downgrade würde ich versuchen, den lokalen Cache zu löschen. Ich hatte dieses Problem beim Wechseln zwischen Facebook-Konten. Löschen Sie Ihre App, zwingen Sie Facebook, das Programm zu beenden, führen Sie dann alles erneut aus und prüfen Sie, ob es bestehen bleibt. Möglicherweise gibt es einen Fehler, bei dem Facebook einen alten, nicht mehr gültigen, zwischengespeicherten Schlüssel weiterleitet. Ein Downgrading kann den Cache leeren oder die ältere Version hat den Fehler nicht. 

4
jriskin

wenn Sie sich abmelden und erneut anmelden, ohne diese App zu verlassen, wird diese Fehlermeldung ebenfalls angezeigt Kommen Sie,

let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE")
            deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in
                println("the delete permission is \(result)")
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    FBSDKAccessToken.setCurrentAccessToken(nil)
                    FBSDKProfile.setCurrentProfile(nil)
                    fbLoginManager.logOut()
                    AppDelegate.sharedAppDelegte().logout()
                })
            })
4
Ravi H Malviya

Ich hatte auch Fehler 308, jedoch verwendete ich das Parse-SDK nicht. 

Diese Fehler traten auf, als ich das Facebook iOS SDK von Version 4.0.1 (FacebookSDKs-iOS-20150402) auf eine der neueren Versionen (4.2.0 - FacebookSDKs-iOS-20150528 oder 4.3.0 - FacebookSDKs-iOS-20150625) aktualisiert habe.

Downgrade des Facebook iOS SDK auf Version 4.0.1 hat dieses Problem für mich gelöst.

Als Randbemerkung: Die neuen Versionen des SDK scheinen gut mit dem Auftreten von 308 Fehlerposten auf SO Anfang Juni zu korrelieren.

4
Dev-iL

Führen Sie die folgenden Schritte aus, um diese Art von Fehler zu beheben: 

  1. Gehen Sie zu Ihrem Projekt 
  2. Klicken Sie auf Funktionen 
  3. Aktivieren Sie den Zugriff auf den Schlüsselbund
3
Dishant Rajput

Ich verwende PFFacebookUtils 1.9.0 und FBSDKLoginKit 4.7.0 .__ nach dem Abmelden und Anmelden (ohne Neustart der App) Lösung. Ziel - C: Fügen Sie einfach [[PFFacebookUtils facebookLoginManager] logOut]; Vor [PFFacebookUtils logInInBackgroundWithReadPermissions hinzu.

3
DaNLtR

Verwenden Sie dieselbe FBSDKLoginManager-Instanz, bis Sie sich abmelden. Erstellen Sie dann eine neue Instanz.

[fbLoginManager logOut];
fbLoginManager = [[FBSDKLoginManager alloc] init];
2
irmu

Offizielle Antwort von Facebook:

Wir verfolgen dieses Problem bereits in einem anderen Fehlerbericht, und es scheint ein Fehler auf Apples Seite sein.

https://developers.facebook.com/bugs/919990934704584/

2

Sie müssen dafür kein Downgrade durchführen. 

Führen Sie folgende Schritte aus, und es sollte funktionieren: - Bereinigen Sie die abgeleiteten Daten (Xcode -> Voreinstellungen -> Standorte -> Klicken Sie auf den kleinen Pfeil neben Abgeleitete Daten). Stellen Sie sicher, dass Sie die abgeleiteten Daten gelesen haben, bevor Sie dies durchführen. Wenn Sie ein kompliziertes Projekt haben und einige dumme Fehler gemacht haben (z. B. einige Dateien gelöscht), müssen Sie möglicherweise das Problem herausfinden, bevor Sie Ihre App erneut ausführen. Es wird jedoch nicht so schwierig sein .- Löschen Sie Ihre App von Ihrem Gerät/Simulator - Entfernen Sie Ihre Facebook-App-Genehmigung von Facebook (Einstellung -> App -> Klicken Sie auf das "x", um Ihre App zu löschen)

Führen Sie die App erneut aus und alles sollte funktionieren.

Viel Glück!

1
Vicky Arora

Ich korrigiere es mit: 1.Add Bolts.framework 2.in AppDelegate: #import 

0
Vlad Burlaciuc

Es liegt an dem authenticationChallenge-Problem, wenn Sie versehentlich versuchen, sich zweimal gleichzeitig anzumelden. Wenn Sie sich beim Debuggen durch weitere Anmeldungen auf der Konsole ein Warnsignal anzeigen, wird dies beim Debuggen auf dem Gerät angezeigt. Ohne den Debugging-Modus erhalten Sie diesen Fehler nicht. Der Grund dafür ist, dass der Schlüsselbund funktioniert, wenn Sie nicht debuggen. 

Es gibt einige Problemumgehungen dafür: 1. Versuchen Sie, sich ohne den Debugging-Modus anzumelden, und wenn dies erfolgreich war, können Sie sich auch im Debugging-Modus erfolgreich anmelden. Überprüfen Sie den Fehlercode FBSDKLoginBadChallengeString und rufen Sie [FBSDKAccessToken setCurrentAccessToken:nil] an, um das Token zu löschen und die Anmeldung erneut durchzuführen.

0
Milan Agarwal

Fehlercode 308 ist FBSDKLoginBadChallengeString

Durch die Verwendung einer gemeinsam genutzten Instanz für FBSDKLoginManager wird das Problem gelöst. Ich habe ein Singleton erstellt, das sicherstellt, dass nur ein FBSDKLoginManager instanziiert wird.

Ich gehe davon aus, dass es mit dem iOS9-Safari-Login zu tun hat, nicht zu 100%

0
MarkHim

Ich hatte das gleiche Problem, als ich versuchte, die Anmelde- und Abmeldeereignisse wie folgt zu erfassen

loginButton = [[FBSDKLoginButton alloc] init];
// Handle clicks on the button
[loginButton
 addTarget:self
 action:@selector(loginButtonClicked) forControlEvents:UIControlEventTouchUpInside];

// Once the button is clicked, show the login dialog
-(void)loginButtonClicked
{
  FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
  [login
    logInWithReadPermissions: @[@"public_profile"]
          fromViewController:self
                     handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
    if (error) { 
      NSLog(@"Process error");
    } else if (result.isCancelled) {
      NSLog(@"Cancelled");
    } else {
      NSLog(@"Logged in");
    }
  }];
}

Dies ist jedoch nur für eine benutzerdefinierte Anmeldeschaltfläche sinnvoll. Wenn Sie die Standard-Anmeldeschaltfläche für Fb verwenden, wurde der FBSDKLoginManager bereits initialisiert. Wenn Sie versuchen, eine weitere zu erstellen, wird der Fehler angezeigt. 

Um das Anmelde- und Abmeldeereignis abzufangen, setzen Sie einfach den Stellvertreter für die Anmeldeschaltfläche und behandeln ihn wie folgt: 

    loginButton = [[FBSDKLoginButton alloc] init];
    loginButton.delegate = self;


- (void)loginButton:(FBSDKLoginButton *)loginButton didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result error:(NSError *)error {
    if (!error) {
        [self getFBProfile];
    }
}

- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton {
    [self logout];
}
0
thanhbinh84

Update Facebook SDK auf die neueste Version behoben.

0
liruqi