私はFacebookiOSSDK(バージョン3.2)を使用していますが、ユーザーがFacebookにアクセスして、承認済みアプリのリストからアプリを削除するまで、すべてが正常に機能します。その時点では、実際にはもう有効ではありませんが、キャッシュされたセッションでログインしています。アクセストークンを強制的にクリアして再度ログインすると、同じ古いアクセストークンが使用されます。
現在application:didFinishLaunchingWithOptions:
、セッションをテストするための次のコードがあります。
// Relogin with cached session
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
NSLog(@"We're logged in to Facebook!");
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:NO completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
NSLog(@"accessToken: %@", session.accessTokenData.accessToken);
NSLog(@"status: %i", status);
NSLog(@"error: %@", error);
switch (status) {
case FBSessionStateOpen:
NSLog(@"FBSessionStateOpen");
NSLog(@"permissions: %@", session.permissions);
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[session closeAndClearTokenInformation];
[Utilities presentMessage:@"Facebook login failed" withTitle:@"Error" level:MessageLevelError];
break;
default:
break;
}
}];
}
アプリを起動するたびに、user_birthdayとメールのアクセス許可でログインしていると表示されます。ただし、取得したaccessTokenを使用してhttps://graph.facebook.com/me?access_token=xxxを開こうとすると、「アクセストークンの検証エラー:ユーザー123がアプリケーション123を承認していません」と返されます。
でトークンをクリアし[FBSession.activeSession closeAndClearTokenInformation];
て新しいログインを強制しても効果はありません。私は常にまったく同じ古いaccessTokenになってしまいます。
同様の質問があります(Facebook SDK 3.1 iOS:ユーザーがFacebook設定からアプリを削除した場合はログインを処理します)が、「ユーザーはiOSアプリを閉じて再起動します...この再起動により、iOSアプリは」と表示されます。修正済み」であり、ユーザーがログインしなくなったことを検出します。」私にはこのような振る舞いはまったくありません。
これが私が最初にセッションを開く方法です:
- (void)openFBSession {
NSArray *perm = @[ @"user_birthday", @"email" ];
[FBSession openActiveSessionWithReadPermissions:perm allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
DLog(@"accessToken: %@", session.accessTokenData.accessToken);
DLog(@"status: %i", status);
DLog(@"error: %@", error);
switch (status) {
case FBSessionStateOpen:
DLog(@"FBSessionStateOpen");
// this is where I need to use session.accessTokenData.accessToken, which is stale
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[FBSession.activeSession closeAndClearTokenInformation];
[Utilities presentMessage:@"Facebook login failed" withTitle:@"Error" level:MessageLevelError];
break;
default:
break;
}
}];
}