3

私が読んでいるもの (多くの FB dev 記事と SO の質問) は役に立たないので、ここに投稿すると思いました。これをすべて iOS 6 と Facebook SDK 3.1.1 で動作させようとしています。

私の iOS アプリは Facebook で認証され、access_token をサーバーに渡し、ユーザーは私のアプリにログインしました。彼らが Facebook に関連して他にできることは、ウォールに何かを投稿することだけです。ユーザーが独自のコメントを追加できるように、従来のダイアログ ウィンドウを使用しています。

新しいインストールでは、最初の 1 時間ほどですべてが完全に機能します。ユーザーが iOS 設定アプリを介してログインしている場合、iOS の簡単な確認ボックスが表示されます。トークンを取得してサーバーに送信すれば、問題ありません。

受け取ったトークンを Facebook のアクセス トークン デバッガーに貼り付けると、1 時間で期限切れになることが示されます。

その時間待ってからアプリに戻ると、何をしようとしても次のエラーが表示されます。

{"error_code":190,"
  error_msg":"Error validating access token: 
              Session has expired at unix time 1351497600. 
              The current unix time is 1351525180. }
  1. 物事がうまくいくようにするには、何をする必要がありますか? SDK 3.1.1 では FBSession がそれを処理するだけだと読みましたが、そうではないようです。アクセス トークンの有効期限が迫っています。有効期限が切れると、iOS/FB SDK から更新されたトークンが返されません。
  2. ログアウトしても (これは を呼び出します[FBSession.activeSession closeAndClearTokenInformation])、これは修正されません。私ができる唯一のことは、iOS シミュレーターの設定で「コンテンツと設定をリセット」し、Settings.app に FB 資格情報を再入力して、アプリを再構築することだけです。そうして初めて、1 時間で期限切れになる別のトークンを取得できます。

ランダムノート:

  1. アプリが再開すると、私は電話をかけていて[FBSession.activeSession handleDidBecomeActive][self.facebook extendAccessTokenIfNeeded]
  2. 上記にリンクされている SO の質問によると、SDK は自動的に を呼び出す必要がありますFBSession#renewSystemAuthorization。そこに NSLog を入れましたが、そのメソッドが呼び出されることはありません。

更新#1

SDK が無効/期限切れのトークンを処理することを読みました。FBRequestConnection#completeWithResults:orError: で発生するようです。コード パスに関する注意事項については、インライン コメントを参照してください。

- (void)completeWithResults:(NSArray *)results
                orError:(NSError *)error
{
    int count = [self.requests count];
    for (int i = 0; i < count; i++) {
        FBRequestMetadata *metadata = [self.requests objectAtIndex:i];
        id result = error ? nil : [results objectAtIndex:i];
        NSError *itemError = error ? error : [self errorFromResult:result];

        id body = nil;
        if (!itemError && [result isKindOfClass:[NSDictionary class]]) {
            NSDictionary *resultDictionary = (NSDictionary *)result;
            body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]];
        }

        ...

        // *******************************************
        // My code actually falls into this block, proving that I do in fact have an invalid session
        // *******************************************
        if ([self isInvalidSessionError:itemError
                        resultIndex:error == itemError ? i : 0]) {
            [metadata.request.session closeAndClearTokenInformation:itemError];

            // *******************************************
            // Unfortunately metadata.request.session is nil, so this condition is never
            // run, so renewySystemAuthorization is never called
            // *******************************************
            if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount){
                [FBSession renewSystemAuthorization];
        }
    }

    ...
}
4

1 に答える 1

7

これは私が求めていたタイプの修正ではありませんが、期待どおりに機能しているように見えるので、この時点で出荷する必要があります.

まず最初に、アプリの古いバージョンが offline_access を要求していたことが判明しました。私は知りませんでした。FB アプリの [設定] > [詳細設定] に移動し、[offline_access 権限を削除する] を有効にしました。現在、2 か月間有効なトークンを取得しています ( facbeook トークン デバッガーを確認してください)。

正しい種類のトークンを取得したので、有効なトークンが非アクティブ化/期限切れになったときに、有効なトークンを取得する際にまだ問題があります。今は 2 か月のトークンを取り戻しているので、その有効期限が切れるのが待ちきれません。そのため、私の計画は、アカウントの設定に移動して認証を解除することで OAuthException をトリガーすることでした。

私の appDidBecomeActive では、[FBRequestConnection startForMeWithCompletionHandler:nil] を配置して、FB へのサイレント リクエストをトリガーするだけで、無効なセッション/トークンが原因で失敗した場合、コード フローは正しいパスを介して実行され、[FBSession renewSystemAuthorization] が呼び出されます。 、これは最終的に私が必要としていたものです。これにより iOS でできることは、次に FB を介してアプリにログインするときに、有効なトークンがもうないことを認識して、iOS から再度プロンプトが表示されることです。[FBSession renewSystemAuthorization] を呼び出すと、次にアプリがアクセスを要求したときに、Facebook にアクセスして、新しい/更新されたトークンを返してくれることを iOS に効果的に伝えます。

現在、ほとんどの場合、すべてが期待どおりに機能しています。

于 2012-11-08T22:14:48.827 に答える