37

アプリを新しいFacebookSDK3.1(iOS6認証をサポート)に移行しようとしています。

正常に動作していたので、iOSが再度許可を求めることをテストするために、FBWebサイトの承認済みアプリのリストからアプリを削除することにしました。

今、私の最初の呼び出し[FBRequest requestForMe]はこのエラーを引き起こします:

応答:

{
  "error": {
    "message": "Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.",
    "type":"OAuthException",
    "code":190,
    "error_subcode":460
  }
}

いくつかの詳細:

私は次のようにセッションを開こうとしています:

   [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                           switch (state) {
                                               case FBSessionStateOpen:
                                                   [self presentPostOptions];
                                                   break;

                                               case FBSessionStateClosed:
                                               case FBSessionStateClosedLoginFailed:
                                                   [FBSession.activeSession closeAndClearTokenInformation];
                                                   break;

                                               default:
                                                   break;
                                           }

それから私は状態でコールバックされますFBSessionStateOpen(この時点でiOSはリクエストダイアログを表示していません、それは予想されることですか)?Facebookはこれを記録します:

2012-09-26 13:43:43.768 MyApp[2177:907] FBSDKLog: FBSession INVALID transition from FBSessionStateCreated to FBSessionStateClosed
2012-09-26 13:43:43.769 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
2012-09-26 13:43:43.837 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateOpen 

セッションが開いたら、presentPostOptionsで次のようにします。

- (void)presentPostOptions
{    
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
        if (!error) {
            self.usersName = user.name;
            self.usersID = user.id;

            [self getPages];
        }
        else
        {
            [self didFailWithError:error];
        }
    }];
}

上記の完了ブロックがコールバックされる前に、メインの状態ハンドラーブロックがFBSessionStateClosed状態とともに呼び出されます。その間、FacebookSDKは上記のエラーをログに記録しました。

システムをリセットする方法が見つかりません。また、私はその原因を本当に理解していません。

誰かが光を当ててくれませんか?

4

7 に答える 7

76

デバイスのFacebookアカウントは、サーバーおよびアプリ/SDKのキャッシュと同期していません。これは、ACAccountStoreメソッドrenewCredentialsForAccountを呼び出すことで解決できます。これにより、OSによるトークンの状態の理解が更新されます。

SDKの次の更新では、トークンが無効になったことを示す応答をサーバーから受信すると、SDKはこのAPIを自動的に呼び出します。SDKの3.1.0リビジョンの場合、アプリケーションはこのAPIを明示的に呼び出す必要があります。コードサンプルは次のとおりです。

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){

            }
        }];
    }
}

APIを呼び出す場所/タイミングにはいくつかのオプションがあります。最も簡単な場所は、アプリケーションの起動時またはビューのロード時に日和見的に呼び出しを行うことです。このアプローチの問題の1つは、多くの場合不要なネットワークラウンドトリップが発生することです。別のオプションは、セッション変更通知が発生したときにそれを呼び出して、セッションが閉じたことを示すことです。また、多くのアプリケーションは、アプリケーションの起動時にgraph.facebook.com/meなどの基本情報を取得します。その場合、エラー応答が発生した場合にこのメソッドを呼び出すことは、iOSにトークンの更新を依頼するのに適した場所です。状態。

うまくいけば、これが役立ちます!

于 2012-09-29T16:09:09.997 に答える
7

アプリ開発者以外のFBユーザーでログインしようとしている場合は、FBアプリの設定で[サンドボックス]オプションがオンになっていないことを確認してください。 ...たぶん明らかですが、うまくいけば他の人を数時間節約することができます。

于 2012-11-06T11:39:13.207 に答える
4

ここで提案されているように、FacebookAPPの設定パネルにiOSAppBundleIDをまだ追加していない場合は追加してみてください。

お役に立てれば。

于 2012-09-28T17:34:48.920 に答える
1

これはFacebookiOSSDKのバグであると確信しており(3.1.1でも)、このバグレポートを提出しました。

サンプルアプリScrumptiousを使用してこのバグを再現しようとしているときに、を使用している場合は正常に再認証できることがわかりましたopenActiveSessionWithReadPermissions。ただし、を介して公開権限を要求している場合はopenActiveSessionWithPublishPermissions、でスタックしcom.facebook.sdk.error 5ます。

于 2012-10-18T04:59:51.903 に答える
1
[FBSession openActiveSessionWithReadPermissions:nil
 allowLoginUI:YES
 completionHandler:^(FBSession *session, FBSessionState  state, NSError *error) 
    {

       switch (state) {
           case FBSessionStateOpen:
               [self presentPostOptions];
               break;

           case FBSessionStateClosed:
           case FBSessionStateClosedLoginFailed:
               [FBSession.activeSession closeAndClearTokenInformation];
               break;

           default:
               break;
       }

      }];   
于 2015-01-08T05:20:27.490 に答える
0

Facebook SDK 3.7.1でも、この問題が発生していました。基本的に、これが発生したときにFacebookのキャッシュからトークンをクリアすることにしました。このような:

if(state == FBSessionStateClosed ) {
     [FBSession.activeSession closeAndClearTokenInformation];
}
于 2014-09-11T16:15:09.397 に答える
0

アクセストークンの検証におけるFacebookエラーのシンプルなSwift2+ソリューション

// Step 1: Logout 
FBSDKLoginManager().logOut()

// Step 2: Login
FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email"], fromViewController: self, handler: { result, error -> Void in 

// ...

}

このエラーが発生した場合は、新しいFacebookセッションを作成する必要があるため、再度ログインする必要があります。

于 2016-07-20T11:05:05.653 に答える