15

何よりも前に、質問する前に、以下の問題を解決するためにthisthisの両方の質問を読みました。

私の問題は、accessToken の有効期限が切れたとき (有効期限が過ぎたか、Facebook の App Center からアプリを手動で削除したため)、次のコードです。

if ([[FBSession activeSession] isOpen]) {
        //do something
    }
else {
        [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            if(FB_ISSESSIONOPENWITHSTATE(status)) {
                //do something
            }
          }
       }];
     }

FBSession.activeSessionを開いた状態でelseブロックに入りますが、「何かをする」が実行されるとaccessTokenが無効になるため、リクエストはエラーを取得します:HTTPステータスコード:400.手順全体を2回実行しようとすると、すぐにFBSessionが許可を求めます(iOS6 統合 facebook、Facebook アプリ、または Safari の Facebook Web サイトの UIAlertView のいずれか) で、残りはスムーズに実行されます。

私の懸念は、うまく機能させるためにすべてを 2 回実行しなければならない理由と、なぜ Facebook SDK が最初に activeSession と accessToken が無効であることを検出できないのかということです。

よろしくお願いします!

4

1 に答える 1

23

リンクした質問、特にFacebook SDK 3.1 - Error validationting access tokenは、デバイス上の Facebook アカウントがサーバーと同期していない問題を説明しています (つまり、App Center からアプリを削除した場合)。そこで述べたように、3.1.1 では、SDK はサーバーから無効な応答を受け取った場合にのみ、デバイス トークンを更新するために呼び出します。これは、サーバーへのラウンドトリップが少ないという利便性のトレードオフです。

コード ブロックが applicationDidFinishLaunching などで実行されると仮定すると、アプリは新しいセッションで開始されるため、else ブロックに移動します。openActiveSessionWithReadPermissions を呼び出すと、iOS 6 デバイスはトークンが有効であると判断し、状態を Open にするので、「何かをする」ことが実行されます。その後、SDK はサーバーから無効な応答を取得し、デバイス トークンを無効にします。その結果、次にプロシージャが呼び出されたときに、ユーザーに適切に再認証を求めるプロンプトが表示されます。

これは意図的なものです。現時点では、エラー コードが無効なトークンを示している場合、アプリケーションでの自動再試行を検討できます。たとえば、Scrumptious サンプルの postOpenGraph 再試行コードを参照してください。あなたの場合、それは次のように見えるかもしれません(デモンストレーション目的で「何かをする」としてrequestForMeを使用しました):

else {
    [FBSessionopenActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        if(FB_ISSESSIONOPENWITHSTATE(status)) {
            //do something
            [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                if (!error){
                    NSLog(@"success on first try");
                } else if ([[error userInfo][FBErrorParsedJSONResponseKey][@"body"][@"error"][@"code"] compare:@190] == NSOrderedSame) {
                    //requestForMe failed due to error validating access token (code 190), so retry login
                    [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                        if (!error){
                            //do something again, or consider recursive call with a max retry count.
                            NSLog(@"success on retry");
                        }
                    }];
                }
            }];
        }
    }];
}
于 2012-10-09T20:22:01.237 に答える