web-dev-qa-db-ja.com

デバイスでFBアカウントを切り替えると、iOS6でFacebook認証が失敗する

Facebook SDK 3.1.1を使用して、iOSアプリケーションにFB Connectを実装しています。これは、新しいFB統合(iOSにログイン)を使用するか、Webビューを介して通常の認証にフォールバックする(どちらの場合もネイティブFacebookアプリケーションをインストールしていない)単純なケースでは正常に機能します。この問題は、iOSレベルでアカウントを切り替えると発生します。別のFBユーザーアカウントでログアウトしてログインします。

ログイン/許可するには、以下を実行します。

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                         [self sessionStateChanged:session state:state error:error];
                                     }];

次に、その状態に達したときにcloseAndClearTokenInformationを実行しても、FBSessionStateClosedLoginFailedを毎回取得します。

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
    NSLog(@"Session State Changed: %u", [[FBSession activeSession] state]);
    switch (state) {
        case FBSessionStateOpen:
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            NSLog(@"FBSessionStateClosedLoginFailed ERROR: %@", [error description]);
            [[FBSession activeSession] closeAndClearTokenInformation];
            break;
        default:
            break;
}

ただし、再試行するたびに同じ状態になります。私のログは次のように述べています:

FBSDKLog: FBSession **INVALID** transition from FBSessionStateCreated to FBSessionStateClosed
FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateClosedLoginFailed Session State Changed: 257
FBSessionStateClosedLoginFailed TOKEN: (null)
FBSessionStateClosedLoginFailed ERROR: Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)" UserInfo=0xb24cc20 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason}

誰でもこれを再現できますか、問題がどこにあるのか考えていますか?

24

別の回答 デバイスとサーバーを手動で再同期する方法を提供します。このコードを呼び出すためにfbRsyncというメソッドを定義しました。必ず#import <Accounts/Accounts.h>を実装ファイルに追加して、このメソッドを定義します。

-(void)fbResync
{
    ACAccountStore *accountStore;
    ACAccountType *accountTypeFB;
    if ((accountStore = [[ACAccountStore alloc] init]) && (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 && (account = [fbAccounts objectAtIndex:0])){

    [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
        //we don't actually need to inspect renewResult or error.
        if (error){

        }
    }];
}

}

次に、fbResyncでエラーが発生した場合は、openActiveSessionWithReadPermissionsを呼び出します。

[FBSession openActiveSessionWithReadPermissions:permissions
                                   allowLoginUI:YES
                              completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
     if(error)
     {
         NSLog(@"Session error");
         [self fbResync];
         [NSThread sleepForTimeInterval:0.5];   //half a second
         [FBSession openActiveSessionWithReadPermissions:permissions
                                            allowLoginUI:YES
                                       completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
            [self sessionStateChanged:session state:state error:error];
                                       }];

     }
     else
         [self sessionStateChanged:session state:state error:error];
 }];

0.5秒の遅延はおそらく不要ですが、現在は安心できます。

これで問題が解決したようです。 Facebookアカウントを切り替えてログインできるようになりました。

私も同じ問題を抱えていました。設定-> FacebookでFBアプリが有効になっていることを確認してください。鉱山は(私はそれを無効にしたことを覚えていませんが)無効にされ、一度有効にすると修正されました。

私のテストプロセスでは、自分のFBアプリを、iPhoneにリンクされているFBアカウントから数回追加および削除しました。魔法のように、私のアプリが無効にされた理由を説明しているかもしれません。

IOS 6でfb sdk 3.1.1を使用。 "[FBSessio openActiveSessionWithReadPermissions ..."メソッドでアクセス許可パラメーターを "nilまたはemail"として渡してください。ここで私のコードはそれがうまくいきました。

#define IOS_NEWER_OR_EQUAL_TO_6 ( [ [ [ UIDevice currentDevice ] systemVersion ] floatValue ] >= 6.0 )

-(void)showFBLogin
{
    [FBSession.activeSession closeAndClearTokenInformation];

    NSArray *permissions = [NSArray arrayWithObjects:@"email, publish_actions, publish_stream", nil];

#ifdef IOS_NEWER_OR_EQUAL_TO_6
    permissions = nil; or NSArray *permissions = [NSArray arrayWithObjects:@"email",nil];
#endif

    NSLog(@"\npermissions = %@", permissions);
    [FBSession openActiveSessionWithReadPermissions:permissions
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error) {
         NSLog(@"\nfb sdk error = %@", error);
         switch (state) {
             case FBSessionStateOpen:
                 [[FBRequest requestForMe] startWithCompletionHandler:
                  ^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
                      if (!error) {
                          //success
                      } 
                  }];
                 break;
             case FBSessionStateClosed:
                 //need to handle
                 break;
             case FBSessionStateClosedLoginFailed:
                 //need to handle
                 break;
             default:
                 break;
         }
     }];
}
3
loganathan


iOS7.1の3.1.3 FB SDKでも同じ問題があります。そして、私はここで解決策を見つけます。それが役に立てば幸い!!
私はここですべての答えを試しました。
@ loganathan nil権限、@ ill_always_be_a_warriors fbResync。
それらすべては私のために働きません。

しかし、iPhone 7.1シミュレータで同じコードを起動するとうまく機能することがわかりました
(SSO「シングルサインオン」なし)

同じコードが古いバージョンのiOS FB SDKで適切に機能します(バージョンはわかりませんが、3.13はわかりません)。
(ただし、ログインしようとしたときにSSOは表示されません)

それで、サンプル問題を書き直そうとします。ここでいくつかの違いが見つかりました。
1。 https://developers.facebook.com/docs/ios/getting-started 新しいFacebookDisplayNameを追加
2。 iTune接続のBundleIDを変更しましたが、Faceboook App Devに更新していません


これらの設定を変更すると、SSO機能を備えたiOSアプリで機能します。
それが役に立てば幸い!!

1
Evan Lin

RenewSystemCredentialメソッドを試しましたか?この投稿を見てください:

Facebook iOS SDK extendAccessTokenが機能していません-fbDidExtendTokenが呼び出されていません

0
Hernan Arber

同じエラーが発生しました。しかし、私は@ill_always_be_a_warriorsメソッドを使用しました:-(void)fbResyncが動作しません。

私は最終的にそれが私の権限の問題であることに気付き、私はoffline_access許可、それは機能します。

0
William Hu