简体   繁体   English

杀毒App(iOS)后Facebook AccessToken无

[英]Facebook AccessToken nil after killing App (iOS)

I am developing an iOS app using the FacebookSDK to login. 我正在使用FacebookSDK开发一个iOS应用程序来登录。

After logging in and killing the App, the currentAccessToken is always nil. 登录并终止App后, currentAccessToken始终为nil。 It only works if I press the home button and re-open the app while it's still running in the background . 它只有在我按下主页按钮并重新打开应用程序时才有效,因为它仍然在后台运行

I started using alert since logs are not working properly after killing the App. 我开始使用警报,因为杀死应用程序后日志无法正常工作。

AppDelegate.swift 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")
    }
}

It always displays "1" in the Alert. 它始终在警报中显示“1”。

It is a similar problem to: FBSDKAccessToken currentAccessToken nil after quitting app or iOS 9 Facebook Access Token is nil on future app launches 这是一个类似的问题: FBSDKAccessToken currentAccessToken nil退出应用程序iOS 9 Facebook Access令牌在未来的应用程序发布时为零

I have been tried: 我曾经尝试过:

  1. Keychain Not working 钥匙串不起作用
  2. Downgrading to 4.17 not possible via Cocoapods 通过Cocoapods降级至4.17无法降级
  3. Changing Transport Security not working as well 改变运输安全也不行

Help/Suggestions, 帮助/建议,

Thanks in advance. 提前致谢。

AccessToken.current does not persist and hence you would have to manually save the access token string and recreate it on consecutive launches. AccessToken.current不会持久存在,因此您必须手动保存访问令牌字符串并在连续启动时重新创建它。

Basically: 基本上:

  1. Save when you get Access token 获得Access令牌时保存

     let strAuthenticationToken = accessToken.authenticationToken UserDefaults.standard.set(strAuthenticationToken, forKey: "AccessToken_Facebook") 
  2. Get Access Token string and recreate the AccessToken object on next launch 获取访问令牌字符串并在下次启动时重新创建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 } 

NOTE: For the ease of this example, the Facebook Access Token string is being saved to UserDefaults but ideally it should be saved to the Keychain. 注意:为了便于此示例,Facebook Access令牌字符串正在保存到UserDefaults但理想情况下应将其保存到Keychain。


In Example: 在示例中:

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) (Swift 4 / Facebook SDK 4.30)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM