iOS Parse Facebook登录错误308 FBSDKLoginBadChallengeString

Eri*_*ric 43 facebook ios parse-platform

我正在尝试使用Parse在我的iOS应用程序中实现Facebook登录.

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

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

    if let user = user {
        //we logged in!
    }
    else {
        //login error!
    }
}
Run Code Online (Sandbox Code Playgroud)

这在模拟器中很有效,但在设备上却不行.在设备上,我收到此错误:

Error Domain = com.facebook.sdk.login Code = 308"无法完成操作.(com.facebook.sdk.login错误308.)

错误代码308用于FBSDKLoginBadChallengeString"登录响应缺少有效的质询字符串".

在我在Facebook上授权我的应用程序之后,这会被调用:

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

网址是:

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

是的,我遵循了Parse的Facebook登录指南中的所有内容(确保所有捆绑ID都匹配,实现了所有必需的AppDelegate方法等).

这个错误究竟是什么意思,你如何解决它?

Cuo*_*Lam 49

一个简单的解决方案适合我.只需在功能中启用Keychain Sharing即可

启用钥匙串共享


lou*_*uth 15

我退出时只看到此错误,然后重新登录.

我的登录和注销代码位于不同的文件中,因为登录和注销的相关UI完全不同,我已经实例化了两个单独的FBSDKLoginManager实例.合并到只有一个实例解决了我的问题.

  • 甚至我创造了单身人士.有时会发生此错误. (3认同)

Obj*_*Sal 15

我在使用FBSDKLoginKit 4.7.1和FBSDKCoreKit 4.8时,也遵循了totvos的解决方法,并为我工作.

解决方法...构建应用程序并将其复制到手机,然后从设备(而不是调试器)启动应用程序.然后,将调试器附加到正在运行的进程.这似乎解决了任何时间问题打破了这一点,并且各种钥匙串操作似乎在调试时正常工作.

参考:https://forums.developer.apple.com/thread/4743#85335


更新:

这种解决方法并不是一直有效,所以我最终使用@ coco的答案:https://stackoverflow.com/a/31480026/877225

  • 不是从调试器运行对我有用.使用SDK 4.8 (4认同)

Lol*_*z89 15

显然,唯一对我有用的解决方案是为目标添加Keychain Sharing Entitlement.

您可以在Project_name-> target_name-> Capabilities-> Keychain Sharing中找到它


coc*_*oco 14

我升级到以下时发现了这个问题:

FBSDKCoreKit 4.4.0
FBSDKLoginKit 4.4.0
FBSDKShareKit 4.4.0.
Run Code Online (Sandbox Code Playgroud)

当我降级到:

FBSDKCoreKit 4.2.0
FBSDKLoginKit 4.1.0
FBSDKShareKit 4.1.0
Run Code Online (Sandbox Code Playgroud)

我没有机会发现升级在什么时候导致这种情况 - 例如,我可以坚持使用4.3.0这三个?


Eri*_*ric 11

固定它.此问题是由使用Parse with 登录引起的FBSDKLoginButton.

这就是我在做的事情:

//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!
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现(硬盘的方式),其敲击一个FBSDKLoginButton试图登录的用户!没有必要也记录用户使用PFFacebookUtils.logInInBackgroundWithReadPermissions.所以我摆脱了fbButtonTouched(),我可以愉快地登录.

所以发生的事情是我在同一时间尝试两次登录,模拟器很满意,但不是设备.

如果你想知道原因,那是因为它收到的登录验证挑战与它所期望的不一致,因为它在第二次登录时从第一次登录中收到了一次尝试,因此等待第二次登录尝试的身份验证质询.

该文档FBSDKLoginButton目前没有提及任何关于点击它启动登录流程的事实,并且因为它是它的子类UIButton,你认为你应该addTarget自己实现登录流程.同时进行两次登录会导致误导FBSDKLoginBadChallengeString.灾难食谱......

编辑:文档已相应更新:

FBSDKLoginButton与工作[FBSDKAccessToken currentAccessToken],以确定要显示什么,并自动挖掘时开始认证(即你不需要手动订阅行动目标).

(我的重点)


MkV*_*Val 8

尝试直接从您的设备运行您的应用程序,而无需从您的Xcode启动它.然后登录到Facebook没有受到308的困扰.之后,您可以恢复从Xcode启动到您的设备没有相同的问题.

这似乎是FB SDK和iOS之间的问题,与Parse无关.如果有人能在这个问题上给我们启发,我会很感激.

我的Xcode版本是7.1,FB SDK是4.8.x.


Mar*_*uro 7

我正在使用

pod 'FBSDKCoreKit', '~> 4.8.0'
pod 'FBSDKLoginKit', '~> 4.8.0'
pod 'FBSDKShareKit', '~> 4.8.0'
Run Code Online (Sandbox Code Playgroud)

... code 308当我在同一会话期间注销并登录时出现问题.在调用之前使用[[FBSDKLoginManager alloc] logOut][facebookLoginManager logOut](使用持久性管理器)logInWithReadPermissions:不起作用,但添加

[FBSDKAccessToken setCurrentAccessToken:nil];
[FBSDKProfile setCurrentProfile:nil];
Run Code Online (Sandbox Code Playgroud)

logInWithReadPermissions:通话工作正常之前.(在iOS 9.2中测试过.)