2011-04-06 27 views
19

正如facebook-ios-sdk自述文件中所述,我的应用程序在执行任何API调用之前调用Facebook#authorize:delegate:。Facebook iOS SDK是否需要用户在每次使用应用程序时进行身份验证?

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

所以我有两个问题:

  1. 是否用户总是为了让Facebook呼吁重新授权?我一直认为它会将访问令牌保存在某个地方,可能是用户默认的,这样你就不需要重新授权。

  2. 如果用户不必每次重新授权,是否有方法检查我的应用程序是否已具有权限,因此用户不必看到该消息并按下好?

+0

你我必须自己保存accessToken和expirationDate。检查我的答案的代码。 – 2011-04-21 19:54:50

回答

23

很遗憾,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的东西,然后零值将被设置。什么都没有发生。否则,将设置真值,并且[_facebook isSessionValid];应该返回TRUE,表示良好的值。继续进行Facebook SDK调用,就好像他们已经登录(他们是)。如果为假,请致电

[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]; 
} 

我在我的应用程序使用此代码,它完美的作品。我从内存中完成了这个工作,所以如果在复制和粘贴时不起作用,我表示歉意。某处可能有错误输入,加上不正确的内存管理。不要忘记,除非获得脱机权限,否则访问令牌会过期。在任何情况下,上面的代码处理一切。

+0

谢谢Daniel。我读过,默认的到期日期只有登录后的24小时。这是你的经历吗? – Bill 2011-04-21 21:45:05

+2

事实上,24小时,但我几乎总是要求“offline_access”权限,它授予它无穷无尽的有效期限(禁止用户手动拒绝权限)。 – 2011-04-21 22:00:15

+0

我明白了。我只需要登录photos.upload操作。如果我请求offline_access并存储该令牌,那会起作用吗?我认为offline_access严格适用于只读数据,但我可能是错的。 – Bill 2011-04-21 22:15:20

2

1)不,我不得不这样做Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self];来获取用户会话远

2)我想你可以调用accestoken在Facebook.m检查

4

当用户登录时,你会得到一个访问令牌和一个失效日期。保存访问令牌,只要尚未达到有效日期,您可以重新使用它。 Facebook SDK有一个方法来做这个检查:[fbConnect isSessionValid],但它似乎有时会产生误报,所以如果请求失败,我有用户登录。

6

问题是它会要求用户每次拨打 方法时都需要进行身份验证 。如果他们已经向我的应用授予 权限,他们会收到一条 消息,指出该应用已获得授权,并且必须按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]; 
} 
+0

@albertamg这正是我如何做的,事情工作得很好,但我有一个问题,就是facebook使用单一登录,这意味着如果我登录到我的iPhone上的Facebook应用程序,我不会是否必须在其他应用中再次登录?但是应用程序只能在fbDIdLogin方法中保存accesstoken和过期日期,并且只有在用户在登录页面上输入其凭据后才能调用这些方法,理想情况下用户不需要输入他的凭证,甚至他也不应该看到登录页面,他第一次看到的所有内容都是“允许访问此应用程序”屏幕 – Yogesh 2011-04-21 21:17:42

+0

@yogesh这里有两件事:用户登录和用户授权您的应用程序。正如你所说,Facebook使用单点登录(至少是sdk的更新版本)。如果用户已经登录(在设备上),他/她仍然必须授权您的应用程序(如果他/她还没有完成)。所以,如果用户没有登录,他将被重定向到登录页面,然后重定向到授权页面。如果用户已经登录,他将被直接重定向到授权页面。 – albertamg 2011-04-22 11:39:28

+0

@albertamg感谢您的回复,所以这就是发生了什么,第一次用户来我的应用程序,他看到一个登录屏幕,他必须输入他的凭据,我想这不应该发生,因为他已经登录到手机上的Facebook应用程序,但是他必须授权应用程序,这很好,什么在困扰着我,他为什么要登录即使他已登录Facebook应用程序 – Yogesh 2011-04-22 18:43:15

0

这里是@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) 
} 
相关问题