4

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

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

这是一种糟糕的用户体验,特别是因为带有“Okay”的 facebook 屏幕对用户来说看起来是一样的。(为什么我要按两次确定?)

简而言之,我的代码是:

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

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

4

1 回答 1

1

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

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

  • 如果用户已从设备设置登录 Facebook:一个对话框用于读取,一个对话框用于发布。
  • 否则,如果用户安装了 Facebook 应用程序:切换到 FB 应用程序一次,并连续获得 2 个提示。
  • 否则:切换到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:代码和其他代码,如登录教程中所述

于 2013-04-18T02:34:44.703 回答