我使用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).
编辑: 我还没能在真实的设备上测试它。
答案 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,但您需要它来创建图形请求。
这意味着SDK必须为用户已经登录的情况提供访问令牌值。在AccessToken类中有一个方法可以为您提供
您只需刷新当前令牌并延长令牌的到期时间。
AccessToken.refreshCurrentToken { accessToken, error in
if let currentAccessToken = accessToken {
let connection = GraphRequestConnection()
connection.add(GraphRequest(graphPath: "/me/friends", accessToken: currentAccessToken)) {..}
} else {
// Show Login
}
}