FacebookSDK呈现login界面两次

使用iOS 6和FacebookSDK将读取和发布权限的请求分成两个独立的调用。 我不知道为什么这样做有什么好处,但似乎需要第一次通过Facebook用户界面两次。

在我的应用程序中,在用户select使用Facebook之前,我不会向Facebook请求任何东西,在这种情况下,他们首先会获得读取权限,然后再获取发布权限。 控制从我的应用程序切换到Facebook(阅读)回到我的应用程序,然后立即回到Facebook(发布),然后回到我的应用程序。

这是一个可怕的用户体验,尤其是因为脸书屏幕的“好”看起来与用户相同。 (为什么我按了两次好?)

我的代码,简而言之是:

Check for a valid FBSession.activeSession if not open call FBSession openActiveSessionWithReadPermissions if successful call FBSession.activeSession reauthorizeWithPublishPermissions then publish post 

代码工作,但用户体验糟糕。 我错过了什么吗?

我的理解是,iOS 6需要双重loginACAccountStore支持,所以Facebook login教程意味着你应该为所有情况下这样做。 切换应用程序两次是一个不好的用户体验,我想我已经想出了一个工作。

首先,对于较老的iOS(例如iOS 5.0),您可以使用openActiveSessionWithPublishPermissions:并一次完成读取和发布权限。 其次,如果用户从未从“设备设置”login到Facebook,则同样的调用将起作用。 因此,下面的代码似乎是这样工作的:

  • 如果用户从设备设置login到Facebook:一个用于阅读的对话框和一个用于发布的对话框。
  • 否则,如果用户安装了Facebook应用程序:切换到FB应用程序一次,并获得连续2个提示。
  • 否则:切换到Safari一次,并连续得到2个提示

我使用Facebook SDK 3.2.1在iOS6和iOS5设备上testing了这个代码

 - (BOOL)hasFacebookInDeviceSettings { ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAccountType *accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"]; BOOL hasFacebookBuiltinAccount = (accountTypeFB != nil); return hasFacebookBuiltinAccount; } - (BOOL)hasLoggedInToFacebookInDeviceSettings { if (![self hasFacebookInDeviceSettings]) { return NO; } BOOL result = [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]; return result; } - (void)openFacebookSessionWithAllowLoginUI:(BOOL)allowLoginUI { if (![self hasLoggedInToFacebookInDeviceSettings]) { // Simpler if we don't have the built in account [FBSession openActiveSessionWithPublishPermissions:@[@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { [self facebookSessionStateChanged:session state:state error:error]; }]; } else if (!FBSession.activeSession.isOpen) { __block BOOL recursion = NO; [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { if (recursion) { return; } recursion = YES; if (error || !FBSession.activeSession.isOpen) { [self facebookSessionStateChanged:session state:state error:error]; } else { assert(FBSession.activeSession.isOpen); if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) { [FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"] defaultAudience:FBSessionDefaultAudienceFriends completionHandler:^(FBSession *session, NSError *error) { [self facebookSessionStateChanged:session state:FBSession.activeSession.state error:error]; }]; } } }]; } } 

hasFacebookInDeviceSettings告诉你,如果这个设备甚至支持Facebook的设置(即这是iOS6 +)。

hasLoggedInToFacebookInDeviceSettings告诉您用户是否已从iOS6 Facebook设备设置login到Facebook。

您需要创build自己的facebookSessionStateChanged:和其他代码,如login教程中所述