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

时间:2015-10-22 15:11:43

标签: ios swift facebook facebook-ios-sdk

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

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

  

无法完成操作。 (com.facebook.sdk.login错误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)
            }

        }

    }
}

7 个答案:

答案 0 :(得分:100)

对于 Xcode8 - iOS10

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

enter image description here

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

Xamarin Studio (由@Kenneth推荐),

Entitlements.plist 文件添加到iOS项目中iOS Bundle Signing选项下的自定义权利

答案 1 :(得分:13)

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

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

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

private var _fbLoginManager: FBSDKLoginManager?

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

<强>更新

Facebook已经意识到了这个问题并且正在调查它。我发现我的解决方案并不总是有效并且已将我的代码更新为以下内容并且从那时起就没有看到它:

_fbLoginManager = nil

退出Facebook时,您需要调用FBSDKLoginManager,并在下次登录时重新创建实例。当使用相同的实例在注销后重新登录时,问题似乎更频繁地发生但是当存在多个{{1}}实例时问题发生得更多,因此如上所述声明它似乎解决了问题。 / p>

答案 2 :(得分:5)

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:@" "];

答案 3 :(得分:1)

看起来问题是用4.9.0解决的。我有同样的问题,并修复了新的SDK版本。
https://developers.facebook.com/docs/ios/change-log-4.x

答案 4 :(得分:1)

修复了facebook-objc-sdk https://github.com/facebook/facebook-objc-sdk/releases/tag/sdk-version-4.38.1及更高版本中的问题。

答案 5 :(得分:0)

我也有这个错误,原因在于我的情况: AuthentificationController上面是Facebook登录按钮,没有导航控制器。 为了解决这个错误,我刚刚添加了导航控制器并以root用户身份验证了我的AuthentificationController。

答案 6 :(得分:0)

请确保您已注销,然后再次尝试登录

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