为什么我会收到 com.facebook.sdk.login 错误 308?

Why am I getting com.facebook.sdk.login error 308?

我正在使用 Xcode 7.0,在 iOS 9.0.2 上测试并使用 Facebook SDK 4.7.0。

当我登录用户时,大部分时间一切正常,但有时我会不断收到此错误,我不知道为什么!

The operation couldn’t be completed. (com.facebook.sdk.login error 308.)

经过研究,我发现有些人同时使用parse.com的FBUtils和官方的FBSDK登录时出现错误,但我只是在我的项目中使用 FBSDK

所以我的问题是,为什么会出现此错误以及如何消除它?

编辑 - 添加代码

这是我的登录逻辑:

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)
            }

        }

    }
}

我找到了解决这个问题的方法。我在需要的地方创建了一个登录管理器的实例:

let loginManager = FBSDKLoginManager()

然后我用它来登录,并在我的注销方法中创建了另一个实例。我通过创建一个在整个应用程序中使用的惰性变量解决了这个问题:

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

更新

Facebook 已发现该错误并正在调查。我发现我的解决方案并不总是有效,并且已将我的代码更新为以下内容,此后就再也没有看到它:

private var _fbLoginManager: FBSDKLoginManager?

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

退出Facebook时,需要调用_fbLoginManager = nil,下次登录时会重新创建实例。在注销后使用同一实例重新登录时,问题似乎更常发生,但当存在 FBSDKLoginManager 的多个实例时,问题发生得更多,因此如上所述声明它似乎已经解决了问题。

看来问题已通过 4.9.0 解决。我有同样的问题,它已通过新的 SDK 版本修复。
https://developers.facebook.com/docs/ios/change-log-4.x

我也有这个错误,原因是我的情况: AuthentificationController 上有 Facebook 登录按钮,但没有导航控制器。 为了解决这个错误,我刚刚添加了导航控制器并将我的 AuthentificationController 设置为 root。

对于Xcode8 - iOS10,

启用 目标功能选项卡中的钥匙串共享解决了我的问题。

可以在此处找到更多详细信息:https://github.com/facebook/facebook-sdk-swift/issues/51


对于 Xamarin Studio(@Kenneth 建议),

Entitlements.plist 文件添加到 [=38= 中 iOS Bundle Signing 选项下的 Custom Entitlements ] 项目。

2018 年 10 月。

原因:challengeReceived 字符串中的“+”号被替换为“”。 FBSDK 中的问题。

快速而肮脏的修复: https://github.com/facebook/facebook-objc-sdk/pull/922

具体替换FBSDKLoginManager中的233行:

NSString *challengeExpected = [self loadExpectedChallenge];

NSString *challengeExpected = [[self loadExpectedChallenge] stringByReplacingOccurrencesOfString:@"+" withString:@" "];

修复在 facebook-objc-sdk https://github.com/facebook/facebook-objc-sdk/releases/tag/sdk-version-4.38.1 及更高版本中可用。