24

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}

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

4

6 に答える 6

38

別の答えは、デバイスをサーバーと手動で再同期する方法を提供します。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 アカウントを切り替えてログインできるようになりました。

于 2012-10-12T16:06:08.083 に答える
12

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

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

于 2013-03-08T23:42:51.570 に答える
3

fb SDK 3.1.1を搭載したios 6。「[FBSessio openActiveSessionWithReadPermissions...」メソッドで権限パラメータを「nil or 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;
         }
     }];
}
于 2013-02-07T07:42:24.630 に答える
0

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

Facebook iOS SDK extendAccessToken が機能しない - fbDidExtendToken が呼び出されない

于 2013-05-21T12:27:03.370 に答える
0

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

私は最終的にそれが私のパーミッションの問題であることを発見しました.私はパーミッションを削除しましoffline_accessた.それはうまくいきます.

于 2014-01-21T08:00:12.593 に答える