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

Ios 为什么我会收到com.facebook.sdk.login错误308?,ios,swift,facebook,facebook-ios-sdk,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 所以我的问题是,为什么我会犯这个错误,我该如何摆脱它 编辑-添加代码 以下是我的登录逻

我正在使用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)
            }

        }

    }
}

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

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时,需要调用
\u fbLoginManager=nil
,该实例将在下次登录时重新创建。当注销后使用同一实例重新登录时,问题似乎更为频繁,但当存在多个
FBSDKLoginManager
实例时,问题更为频繁,因此如上所述声明似乎解决了问题。

看起来问题已通过4.9.0解决。我也有同样的问题,新的SDK版本已经修复了。

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

对于Xcode8-iOS10

启用目标的“功能”选项卡内的钥匙链共享解决了我的问题

更多详细信息可在此处找到:


对于Xamarin Studio(由@Kenneth建议)

授权.plist文件添加到iOS项目中
iOS捆绑签名
选项下的自定义授权

2018年10月

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

快速修复:

具体而言,请替换FBSDKLoginManager中的第233行:

NSString *challengeExpected = [self loadExpectedChallenge];



可在
facebook objc sdk
及以上版本中修复此问题。

这可能会很有用:在不附加调试器的情况下重试,我的facebook sdk在连接到xcode时会出现此错误,但在没有调试器的情况下运行时会出现此错误。此错误适用于我,我认为最好的方法是将FBSDKLoginManager作为单个实例放入AppDelegate中。非常感谢。是的,我应该补充一点,这段代码在我的UserManager.swift类中,它是一个单实例。不幸的是,这些解决方案都不适用于FBSDK 4.8.0-一个持久实例不适用,注销时也不清除该实例,然后在Login上重新实例化,你能详细说明这些东西放在哪里吗?你把它们放在你需要使用FBLoginManager的类中,所以你不用var或let,而是这样做,它仍然是不固定的。救生圈!谢谢!!优秀的解决方案对我有效!但为什么这是一个解决方案。为什么我需要这样做?@Developer,iOS 10在应用程序功能中启用了keychain(在授权文件中有一个条目),这是使用keychain的一个要求。更多信息:@ZaidPathan谢谢,但似乎没有这样的应用程序ID选项,所以我只需要在Xcode中打开钥匙链功能,因为我不需要在应用程序之间共享钥匙链。哦,哇,我在他们最新的SDK上也有同样的问题。这是少校。Facebook知道这件事吗?如果是,他们会怎么说?调整所接受的挑战不是更好吗?如果Facebook将其回滚,challengeReceived再次返回并带有“+”,那么该软件将再次无法工作。好的,我认为Facebook已经知道了这个问题:在bug中,它说4.37.0版工作正常。我认为最好的修复方法是将FBSDKCoreKit和FBSDKLoginKit回滚到4.37.0,然后等待更新,直到Facebook发布一个修复程序。v4.38.1(及以上版本)有这个修复程序。Check v4.38.1未在Cocopods中更新,仅4.38.0可用。所以我回滚到4.37.0,但请不要忘记,您仍然需要启用密钥链共享。
NSString *challengeExpected = [[self loadExpectedChallenge] stringByReplacingOccurrencesOfString:@"+" withString:@" "];