FacebookSDK提供两次登录界面



使用iOS 6和FacebookSDK将读取和发布权限的请求拆分为两个单独的调用。我不知道为什么这有任何好处,但它似乎需要在第一次通过时向用户展示两次Facebook UI。

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

这是一种糟糕的用户体验,尤其是因为脸书上带有"OK"的屏幕对用户来说看起来是一样的。(我为什么按两次OK?)

简而言之,我的代码是:

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

代码有效,但用户体验很糟糕。我是不是错过了什么?

我的理解是,iOS 6需要双重登录才能支持ACAccountStore,因此Facebook登录教程暗示您应该在所有情况下都这样做。切换两次应用程序是一种糟糕的用户体验,我想我已经想出了一个解决办法。

首先,对于较旧的iOS(如iOS 5.0),您可以使用openActiveSessionWithPublishPermissions:并一次性完成读取和发布权限吗。其次,如果用户从未从"设备设置"登录过Facebook,则此调用也有效。因此,以下代码似乎是这样工作的:

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

我使用Facebook SDK 3.2.1 在iOS6和iOS5设备上测试了此代码

- (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设备设置登录到Facebook。

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

最新更新