如何在UserDefaults中保存和阅读Facebook AccessToken?

时间:2017-08-08 12:28:11

标签: ios swift firebase facebook-graph-api firebase-authentication

我使用FirebaseAuthUi来管理我的应用中的身份验证。

当用户登录时,我需要他们的Facebook访问令牌来发出图表请求。用户首次登录时工作正常,但是当重新启动应用程序时,图形API调用不起作用,因为我不再拥有Facebook访问令牌。

所以我需要在UserDefaults或Keychain中保存此令牌。我的问题是我没有设法将此令牌保存为AccessToken。我可以将它保存为String,但是当我想要进行图形调用时,我需要一个AccessToken,我认为我无法从保存的String中获取AccessToken。

你知道我怎么能做到吗?这是我的代码:

//checkLoggedIn
authHandle = Auth.auth().addStateDidChangeListener { auth, user in
    if let user = user {
        // User is signed in.

        UserDefaults.standard.set(String(describing: AccessToken.current), forKey: "savedFacebookToken")
        UserDefaults.standard.synchronize()
        let savedFacebookToken = UserDefaults.standard.object(forKey: "savedFacebookToken")

        let connection = GraphRequestConnection()
        connection.add(GraphRequest(graphPath: "/me/friends", accessToken: savedFacebookToken as! AccessToken)) { httpResponse, result in

我收到以下错误消息:

Could not cast value of type 'Swift._NSContiguousString' (0x10a0f4f50) to 'FacebookCore.AccessToken' (0x1068aa9f0).

编辑: 我还没能在真实的设备上测试它。

3 个答案:

答案 0 :(得分:1)

更好的方法 - :

为userDefaults创建扩展程序 - :

import  Foundation
// EXTENSION TO USER DEFAULTS
extension UserDefaults{

    // CREATE ENUM HAVING 1 STATE VALUE

    enum userDefaultKeys:String {
        case FacebookToken
       }

    // SAVE ACCESS TOKEN IN USER DEFAULTS

    func setAccessToken(id:String){
        set(id, forKey: userDefaultKeys.FacebookToken.rawValue)
        synchronize()
    }

// GET ACCESS TOKEN FROM USER DEFAULTS

    func getAccessToken()->String{

        return string(forKey: userDefaultKeys.FacebookToken.rawValue)
    }
}

在您的控制器类中,只需调用 - :

等方法

设置 - :

// SET TOKEN AS STRING TO USER DEFAULTS

UserDefaults.standard.setAccessToken(value: "token") 

获得 - :

// GET TOKEN RESULT AS STRING

    fileprivate func getSavedFacebookToken() -> String{
        return UserDefaults.standard.getAccessToken()
    }

根据你的代码 - :

//checkLoggedIn
authHandle = Auth.auth().addStateDidChangeListener { auth, user in
    if let user = user {
        // User is signed in.

        UserDefaults.standard.setAccessToken(id: String(describing: AccessToken.current))
        let savedFacebookToken = UserDefaults.standard.getSavedFacebookToken()

         let connection = GraphRequestConnection()
        connection.add(GraphRequest(graphPath: "/me/friends", accessToken: AccessToken(savedFacebookToken))) { httpResponse, result in

<强> REAMRK - :

  

永远不要在UserDefaults中保存访问令牌。 NSUserDefaults很容易   即使在非越狱设备上也可读。如果安全是一个问题   你,然后我会将数据存储在钥匙串中。

请参阅以下链接 - :

Storing authentication tokens on iOS - NSUserDefaults vs Keychain?

而且我会说不需要保存令牌可以过期或更改,这可能会在您的应用中产生问题。

阅读有关访问令牌的Facebook文档以获得更多说明 -

https://developers.facebook.com/docs/facebook-login/access-tokens

答案 1 :(得分:0)

您的访问令牌是整数,不是字符串中的类型转换。你可以保存这个值,或者根据你的保存值,你可以使用最后一行代码。

 UserDefaults.standard.set(AccessToken.current, forKey: "savedFacebookToken")

获取令牌值

let currenttoken  = UserDefaults.standard.integer(forKey: "savedFacebookToken")

或者您可以将其转换为字符串

 let currenttoken=  UserDefaults.standard.object(forKey: "savedFacebookToken") as! String

答案 2 :(得分:0)

FacebookCore.AccessToken是一个结构,这意味着您无法将其直接保存到UserDefaults,但您需要它来创建图形请求。

enter image description here

这意味着SDK必须为用户已经登录的情况提供访问令牌值。在AccessToken类中有一个方法可以为您提供

enter image description here

您只需刷新当前令牌并延长令牌的到期时间。

AccessToken.refreshCurrentToken { accessToken, error in
    if let currentAccessToken = accessToken {
        let connection = GraphRequestConnection()
        connection.add(GraphRequest(graphPath: "/me/friends", accessToken: currentAccessToken)) {..}
    } else {
        // Show Login
    }
}