繁体   English   中英

Facebook iOS SDK是否要求用户在每次使用应用程序时进行身份验证?

[英]Does the Facebook iOS SDK require the user to authenticate every time they use the app?

正如facebook-ios-sdk的自述文件中所述,我的应用程序在执行任何API调用之前调用Facebook#authorize:delegate:

此方法要求用户进行身份验证(在Facebook应用程序或Safari中),然后将控制权交还给我的iPhone应用程序。 问题是它每次调用方法时都要求用户进行身份验证。 如果他们已经授予我的应用程序权限,他们会收到一条消息,说该应用程序已经获得授权,他们必须按Okay才能返回我的应用程序。 它看起来不太专业。

所以我有两个问题:

  1. 用户是否总是必须重新授权才能拨打Facebook电话? 我一直以为它会将访问令牌保存在某处,也许是在用户默认值中,这样您就不需要重新授权了。

  2. 如果用户不必每次都重新授权,有没有办法检查我的应用程序是否已经拥有权限,那么用户不必看到该消息并按下确定?

不幸的是,Facebook SDK不会自动为我们处理它。 除了自己构建SDK之外,最简单的方法是:

每次分配_facebook:

_facebook = [[Facebook alloc] initWithAppId:@"SuperDuperAppID"];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"];
NSString *expirationDate = [prefs stringForKey:@"facebook-expirationDate"];
_facebook.accessToken = accessToken;
_facebook.expirationDate = expirationDate;

如果您从未在NSUserDefaults中保存任何内容,则将设置nil值。 什么都没发生。 否则,将设置真值, [_facebook isSessionValid]; 应该返回TRUE,表示良好的值。 继续进行Facebook SDK调用,就好像他们已登录(他们是)。 如果为false,则调用

[facebook authorize:permissions delegate:self]; 

照常。

然后确保支持以下Facebook委托方法:

- (void)fbDidLogin {
NSString *accessToken = _facebook.accessToken;
NSString *expirationDate = _facebook.expirationDate;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:accessToken forKey:@"facebook-accessToken"];
[prefs expirationDate forKey:@"facebook-expirationDate"];
[prefs synchronize];
}

我在我的应用程序中使用此代码,它完美地运行。 我是从内存中做到的,所以如果它不能用于复制和粘贴,我会道歉。 某处可能存在错误,加上不正确的内存管理。 除非获得脱机许可,否则不要忘记访问令牌过期。 无论如何,上面的代码处理一切。

问题是它每次调用方法时都要求用户进行身份验证。 如果他们已经授予我的应用程序权限,他们会收到一条消息,说该应用程序已经获得授权,他们必须按Okay才能返回我的应用程序。

1)用户是否总是需要重新授权才能拨打Facebook电话? 我一直以为它会将访问令牌保存在某处,也许是在用户默认值中,这样您就不需要重新授权了。

每次必须经历登录过程的原因是,在第一次成功签名后, Facebook SDK不会以持久的方式保存访问令牌

2)如果用户不必每次都重新授权,有没有办法检查我的应用程序是否已经拥有权限,那么用户不必看到该消息并按下确定?

Facebook SDK不保存访问令牌这一事实并不意味着您不能自己动手。 以下代码说明了如何从NSUserDefaults保存/检索访问令牌。

-(void)login {
    // on login, use the stored access token and see if it still works
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    facebook.accessToken = [defaults objectForKey:ACCESS_TOKEN_KEY];
    facebook.expirationDate = [defaults objectForKey:EXPIRATION_DATE_KEY];

    // only authorize if the access token isn't valid
    // if it *is* valid, no need to authenticate. just move on
    if (![facebook isSessionValid]) {
        NSArray * permissions = [NSArray arrayWithObjects:@"read_stream", @"offline_access", @"email", nil];
        [facebook authorize:permissions delegate:self];
    }
}

/**
 * Called when the user has logged in successfully.
 */
- (void)fbDidLogin {
    // store the access token and expiration date to the user defaults
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY];
    [defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY];
    [defaults synchronize];
}

当用户登录时,您将获得访问令牌和到期日期。 保存访问令牌,只要您还没有达到到期日,就可以重复使用它。 Facebook SDK有一个方法来检查:[fbConnect isSessionValid]但它似乎有时会给出误报,所以如果请求失败,我会让用户登录。

1)不,我不得不做Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self]; Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self]; 让用户会话远离

2)我想你可以在Facebook.m打电话给口音来检查

以下是@Daniel Amitay回答的更实际的方法:
在视图控制器中使用登录按钮编写

//saving user data to user defaults in order to support Facebook SSO
let token = FBSDKAccessToken.currentAccessToken()
let prefs = NSUserDefaults.standardUserDefaults()
let nsdataToken = NSKeyedArchiver.archivedDataWithRootObject(token)
prefs.setObject(nsdataToken, forKey: "facebook-AccessToken")
prefs.synchronize()

在AppDelegate文件中的func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool你写的如下

//restoring Facebook SSO session from user defaults
let prefs = NSUserDefaults.standardUserDefaults()
if let nsdataToken = prefs.valueForKey("facebook-AccessToken") as? NSData {
    let token = NSKeyedUnarchiver.unarchiveObjectWithData(nsdataToken) as! FBSDKAccessToken
    FBSDKAccessToken.setCurrentAccessToken(token)
}

暂无
暂无

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

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