ios - 杀死应用程序后 Facebook AccessToken 为零(iOS)

标签 ios swift facebook-login facebook-access-token fbsdk

我正在开发一个使用 FacebookSDK 登录的 iOS 应用程序。

登录并杀死App后,currentAccessToken始终为nil。仅当应用程序仍在后台运行时按下主页按钮并重新打开应用程序时,它才有效。

我开始使用警报,因为在终止应用程序后日志无法正常工作。

AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)

    let accessToken = FBSDKAccessToken.current()
    if accessToken == nil {
        Auth.auth().addStateDidChangeListener { (auth, user) in
            alert(title: user?.uid ?? "1")
        }
        alert(title: "2")
    } else {
        alert(title: accessToken?.userID ?? "3")
    }
}

它总是在警报中显示“1”。

这是一个类似的问题: FBSDKAccessToken currentAccessToken nil after quitting app 或者 iOS 9 Facebook Access Token is nil on future app launches

我已经尝试过:

  1. 钥匙串(keychain)不工作
  2. 无法通过 Cocoapods 降级到 4.17
  3. 更改传输安全性效果不佳

帮助/建议,

提前致谢。

最佳答案

AccessToken.current 不会持续存在,因此您必须手动保存访问 token 字符串并在连续启动时重新创建它。

基本上:

  1. 获取访问 token 后保存

    let strAuthenticationToken = accessToken.authenticationToken
    UserDefaults.standard.set(strAuthenticationToken,
                          forKey: "AccessToken_Facebook")
    
  2. 获取访问 token 字符串并在下次启动时重新创建AccessToken对象

    if let strAuthenticationToken = UserDefaults.standard.string(forKey: "AccessToken_Facebook") {
    //Create AccessToken for facebook login
    let accessToken = AccessToken(authenticationToken: strAuthenticationToken)
    
    //...Skip Login and directly proceed to get facebook profile data with the AccessToken
    }
    

注意:为简化此示例,将 Facebook 访问 token 字符串保存到 UserDefaults,但理想情况下应将其保存到钥匙串(keychain)。


在例子中:

func loginWithFacebook() {
    //Check for previous Access Token
    if let accessToken  = AccessToken.current {
        //AccessToken was obtained during same session
        getAccountDetails(withAccessToken: accessToken)
    }
    else if let strAuthenticationToken = UserDefaults.standard.string(forKey: "AccessToken_Facebook") {
        //A previous access token string was saved so create the required AccessToken object
        let accessToken = AccessToken(authenticationToken: strAuthenticationToken)

        //Skip Login and directly proceed to get facebook profile data with an AccessToken
        getAccountDetails(withAccessToken: accessToken)
    }
    else {
        //Access Token was not available so do the normal login flow to obtain the Access Token
        doFacebookLogin()
    }
}

func doFacebookLogin() {
    LoginManager().logIn(readPermissions: [.publicProfile, .email], viewController: nil) { loginResult in
        switch loginResult {
        case .failed(let error):
            print(error)

        case .cancelled:
            print("User cancelled login.")

        case .success(let grantedPermissions,
                      let declinedPermissions,
                      let accessToken):

            //Save Access Token string for silent login purpose later
            let strAuthenticationToken = accessToken.authenticationToken
            UserDefaults.standard.set(strAuthenticationToken,
                                      forKey: "AccessToken_Facebook")

            //Proceed to get facebook profile data
            self.getAccountDetails(withAccessToken: accessToken)
        }
    }
}

func getAccountDetails(withAccessToken accessToken: AccessToken) {
    let graphRequest: GraphRequest = GraphRequest(graphPath     : "me",
                                                  parameters    : ["fields" : "id, name, email"],
                                                  accessToken   : accessToken,
                                                  httpMethod    : GraphRequestHTTPMethod.GET,
                                                  apiVersion    : GraphAPIVersion.defaultVersion)
    graphRequest.start { (response, result) in
        switch result {
        case .success(let resultResponse):
            print(resultResponse)
        case .failed(let error):
            print(error)
        }
    }
}

(Swift 4/Facebook SDK 4.30)

关于ios - 杀死应用程序后 Facebook AccessToken 为零(iOS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49385629/

相关文章:

ios - 在 "Swift3"中可编程设置方向

iOS 9 Parse (v 1.8.5) Facebook (v 4.6) FBSDKInternalUtility checkRegisteredCanOpenURLScheme 登录崩溃

ios - NSPredicate 乱序/额外信息

objective-c - 需要建议在 iOS 中处理大型矢量图形

swift - 获取 Swift 中给定字符的所有变音符号?

swift - 有什么方法可以替换 Swift String 上的字符吗?

ios - MonoTouch中的自定义标签栏项目

ios - Swift - 向 tableView 中的每个单元格添加一个复选框

oauth-2.0 - 使用 Cognito 登录 Facebook 重定向到 URL 时出现错误

javascript - IE 9 中阻止的 Facebook 登录弹出窗口