私が読んでいるもの (多くの 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. }
- 物事がうまくいくようにするには、何をする必要がありますか? SDK 3.1.1 では FBSession がそれを処理するだけだと読みましたが、そうではないようです。アクセス トークンの有効期限が迫っています。有効期限が切れると、iOS/FB SDK から更新されたトークンが返されません。
- ログアウトしても (これは を呼び出します
[FBSession.activeSession closeAndClearTokenInformation]
)、これは修正されません。私ができる唯一のことは、iOS シミュレーターの設定で「コンテンツと設定をリセット」し、Settings.app に FB 資格情報を再入力して、アプリを再構築することだけです。そうして初めて、1 時間で期限切れになる別のトークンを取得できます。
ランダムノート:
- アプリが再開すると、私は電話をかけていて
[FBSession.activeSession handleDidBecomeActive]
、[self.facebook extendAccessTokenIfNeeded]
- 上記にリンクされている 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];
}
}
...
}