FacebookSDK 呈现登录 UI 两次

2023-12-23

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

在我的应用程序中,在用户选择使用 Facebook 之前,我不会向 Facebook 请求任何内容,在这种情况下,他们首先会看到 UI 以获取读取权限,然后再次获取发布权限。控制从我的应用程序切换到 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 需要双重登录ACAccountStore支持,所以脸书登录教程 https://developers.facebook.com/docs/howtos/ios-6/意味着您应该对所有情况执行此操作。切换应用程序两次是一种糟糕的用户体验,我想我已经想出了一个解决方法。

首先,对于较旧的 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:和其他代码,如中所述登录教程 https://developers.facebook.com/docs/howtos/ios-6/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FacebookSDK 呈现登录 UI 两次 的相关文章

随机推荐