これは単なる Facebook の動作です。アプリを起動するたびにセッションを「再開」する必要があります。推測は正しいです。トークンの状態が原因です。簡単な解決策は、[FBSession activeSession].isOpen 状態を確認することです。 NO が返された場合は、openActiveSessionWithAllowLoginUI << はい同じ facebook メソッドを呼び出しますが、返されるすべての状態をチェックします。
セッションが以前に開かれていた場合は、保存されたトークンを使用してセッションを再度開きます。ログイン UI について心配する必要はありません。セッションは以前に開かれていたため、再び表示されることはないからです。
if (![FBSession activeSession].isOpen) {
[self connectWithFacebook];
}
- (void) connectWithFacebook {
// The user has initiated a login, so call the openSession method
// and show the login UI if necessary << Only if user has never
// logged in or ir requesting new permissions.
PPAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate openSessionWithAllowLoginUI:YES];
}
そして、アプリデリゲートで
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
NSArray *permissions = @[@"any_READ_permision_you_may_need"];
return [FBSession openActiveSessionWithReadPermissions:permissions
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
if (error) {
NSLog (@"Handle error %@", error.localizedDescription);
} else {
[self checkSessionState:state];
}
}];
}
- (void) checkSessionState:(FBState)state {
switch (state) {
case FBSessionStateOpen:
break;
case FBSessionStateCreated:
break;
case FBSessionStateCreatedOpening:
break;
case FBSessionStateCreatedTokenLoaded:
break;
case FBSessionStateOpenTokenExtended:
// I think this is the state that is calling
break;
case FBSessionStateClosed:
break;
case FBSessionStateClosedLoginFailed:
break;
default:
break;
}
}
これは簡単な修正であり、機能します。セッションを閉じるだけでも再現できますが、トークンキャッシュをクリアせずに[[FBSession activeSession] close]
ここで説明されているようにトークンキャッシュポリシーを変更することもできますhttp://developers.facebook.com/docs/howtos/ token-caching-ios-sdk/