4

FacebookSDK で iOS 6 を使用すると、読み取り権限と公開権限の要求が 2 つの別々の呼び出しに分割されます。これに利点がある理由はわかりませんが、最初から 2 回まで Facebook UI をユーザーに提示する必要があるようです。

私のアプリでは、ユーザーが Facebook を使用することを選択するまで、Facebook に何も要求しません。この場合、最初に読み取り許可を取得するための UI が表示され、次に公開許可を取得するために再び表示されます。コントロールは、アプリから facebook (読み取り用) に切り替わり、すぐに facebook (公開用) に戻り、アプリに戻ります。

これはひどいユーザー エクスペリエンスです。特に、"OK" が表示された Facebook 画面がユーザーには同じように見えるためです。([OK] を 2 回押すのはなぜですか?)

私のコードは、一言で言えば次のとおりです。

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ログイン チュートリアルでは、すべての場合にこれを行う必要があることを示唆しています。アプリを 2 回切り替えるのはユーザー エクスペリエンスが悪いため、回避策を考え出したと思います。

まず、古い iOS (iOS 5.0 など) ではopenActiveSessionWithPublishPermissions:、読み取りと公開のアクセス許可を一度に使用して実行できます。次に、ユーザーがデバイス設定から Facebook にログインしたことがない場合でも、この同じ呼び出しが機能します。したがって、次のコードは次のように機能するようです。

  • ユーザーがデバイス設定から Facebook にログインしている場合: 読み取り用に 1 つのダイアログ、公開用に 1 つのダイアログ。
  • ユーザーが Facebook アプリをインストールしている場合: FB アプリに 1 回切り替えると、2 つのプロンプトが連続して表示されます。
  • それ以外の場合: Safari に 1 回切り替えて、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 に答える