10

いくつかのコンテキスト:ユーザーは以前にアプリをインストールし、FBを承認し、すべてがうまく機能し、その後(facebook.comを介して)FBパスワードを変更し、アプリを削除し、再インストールしてから初めて実行しています再インストールします。

私は呼び出し[FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler]allowLoginUI: YESおり、読み取り権限は「email、user_about_me、user_birthday、user_interests、user_location」です。

FBSessionState私が入っているのはcompletionHandlerですFBSessionStateClosedLoginFailed。エラーの NSLog は次のとおりです。

Error Domain=com.facebook.sdk Code=2 "The operation could not be completed. (com.facebook.sdk error 2.)" UserInfo=0x1cd68c00 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason . UserInfo=0x1cd5b970 {NSLocalizedDescription=Facebook サーバーはこのアクセス要求を実行できませんでした: アクセス トークンの検証中にエラーが発生しました: ユーザーがパスワードを変更したため、セッションは無効になりました。}}

その内部エラー ドメインはACErrorDomain、エラー コードACErrorPermissionDeniedです。では、ユーザーにアプリを再認証させるにはどうすればよいでしょうか?

もう一度呼び出してみopenActiveSessionWithReadPermissionsましたが、同じエラーが出力され続けます。私も試し[FBSession.activeSession closeAndClearTokenInformation]ましたが、それは何もしないようです (おそらく がないためactiveSession)。

4

2 に答える 2

12

3.2.1 Facebook SDK で非常によく似た種類のバグが発生しました。私の場合、FBSessionStateOpen に入りましたが、無効なアクセス トークンが与えられました。質問にあるように、通常の closeAndClearTokenInformation やアプリを削除しても問題は解決しません。このシナリオで私が元に戻すことができた唯一の方法は、ユーザーに設定アプリでパスワードを変更させることです。これが私がすることです。

// In my completion handler FBSessionStateOpen is called BUT an
// invalid accessToken was detected.

[session closeAndClearTokenInformation];
[FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, 
                                    NSError *error) 
  {
     if (result == ACAccountCredentialRenewResultFailed ||
         result == ACAccountCredentialRenewResultRejected)
     {
       [self showErrorMessage:NSLocalizedString(@"You may need to re-enter your Facebook password in the iPhone Settings App.\n", nil)];
     }
     else 
     {
        // attempt opening a session again  (after they have updated their account 
        // settings I end up here)

        [self facebookLogin];  // Performs openActiveSessionWithReadPermissions, 
                               // but this time around the token issued should be good.
     }
 }];

これは、私が思いついた唯一の実用的な解決策です。

于 2013-04-03T19:33:21.833 に答える
0

このようなコードで新しいアクセストークンを取得する必要があると思います...

[FBSession.activeSession closeAndClearTokenInformation];
[[FBSession class] performSelector:@selector(renewSystemAuthorization)];
[FBSession openActiveSessionWithReadPermissions:nil
                               allowLoginUI:YES
                          completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

}
于 2013-02-03T02:11:38.263 に答える