为什么我会收到 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 及更高版本中可用。
我正在使用 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 及更高版本中可用。