Facebook iOS SDK是否要求用户每次使用应用程序时进行身份validation?
正如facebook-ios-sdk自述文件中所述,我的应用程序在执行任何API调用之前调用Facebook#authorize:delegate:。
此方法要求用户进行身份validation(在Facebook应用程序或Safari中),然后将控制权重回到我的iPhone应用程序。 问题是每次我调用方法时都会要求用户进行身份validation。 如果他们已经授予我的应用程序的权限,他们会收到一条消息,说该应用程序已经被授权,他们必须按Okay才能返回到我的应用程序。 它看起来不是很专业。
所以我有两个问题:
-
用户是否必须重新授权才能进行Facebook通话? 我一直认为它会把访问令牌保存在某个地方,也许在用户的默认情况下,这样你就不需要重新授权了。
-
如果用户不必每次重新授权,有没有办法检查我的应用程序是否已经有权限,所以用户不必看到这个消息,然后按OK。
不幸的是,Facebook SDK不会自动为我们处理。 除了自己将其构build到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调用,就好像他们已经login(他们是)。 如果为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]; }
我在我的应用程序中使用这个代码,它完美的作品。 我从内存中做了这个,所以我很抱歉,如果它不复制和粘贴。 某处可能有错误,加上不正确的内存pipe理。 除非获得脱机权限,否则不要忘记访问令牌到期。 在任何情况下,上面的代码处理一切。
问题是每次我调用方法时都会要求用户进行身份validation。 如果他们已经授予我的应用程序的权限,他们会收到一条消息,说该应用程序已经被授权,他们必须按Okay才能返回到我的应用程序。
1)用户是否总是需要重新授权才能进行Facebook调用? 我一直认为它会把访问令牌保存在某个地方,也许在用户默认情况下,这样就不需要重新授权。
不得不每次都要经过login过程的原因是,首次成功login后, Facebook SDK不会持久保存访问令牌 。
2)如果用户不必每次重新授权,有没有办法检查我的应用程序是否已经有权限,所以用户不必看到这个消息,然后按OK。
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]; }
当用户login时,您将获得访问令牌和有效date。 保存访问令牌,只要尚未达到有效date,就可以重新使用它。 Facebook的SDK有一个方法来做这个检查:[fbConnect isSessionValid],但它似乎有时误报,所以我有用户login,如果请求失败。
1)不,我不得不做Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self];
Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self];
去掉用户会话
2)我想你可以在Facebook.m
调用accestoken来检查
@Daniel Amitay更实际的做法是:
在视图控制器与loginbutton,你写
//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
你写下面的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) }
- IOS Facebook SDKlogin对话框显示两次(2login对话框)
- 在ios Facebook SDK 3.0中login的应用程序崩溃
- 获取login用户的Facebook好友列表
- UIActivityViewController不会在iOS 7上显示FB和Twitter
- iOS用最新的FBSDK获取用户的家乡
- Facebook注册:操作无法完成(com.facebook.sdk错误2)
- 在本地Facebook iPhone应用程序中共享URL的自定义URLscheme
- 升级到SDK 4.1后,Facebooklogin失败(总是被取消)
- 检查用户是否安装了Facebook Messenger的iOS 9