サンプル プログラムを使用して facebook-ios-sdk を学習していますが、問題が見つかりました。デバイスで Facebook にログインしてそのサンプル アプリを実行すると、すべて問題ありませんが、デバイスから Facebook アカウントを削除して、そのサンプル アプリをもう一度実行すると、ログイン プロセスを通過でき、SCViewController が引き続き表示されます (Facebook アプリ プロセスへの高速アプリ切り替えがありますが、必要なのは "OKey" ボタンをクリックすることだけです。 Facebook にログインするために、電子メール/パスワード情報を入力する必要はありません)。
コードを確認したところ、アカウントがデバイスから削除された後も、トークンがFBSession.activeSession.accessToken
有効であると見なされていることがわかりました。何か問題ある?トークンをクリアしてログインダイアログをポップアップさせるにはどうすればよいですか? [FBSession.activeSession closeAndClearTokenInformation]
Facebook SDK ドキュメントによると、ログアウト時に既に呼び出しています。トークンはクリアする必要がありますが、そうではありません。
私が使用する環境: XCode 4.6.1、iPad 6.1 シミュレーター、facebook-ios-sdk v3.2.1。
更新: ここにコードを貼り付けます: SCAppDelegate.m に、サンプル コードではなく SDK オンライン ドキュメントにある 3 つの関数を追加しました。
- (void)showLoginView
{
UIViewController* topViewController = [self.navigationController topViewController];
UIViewController* modalViewController = [topViewController modalViewController];
// If the login screen is not already displayed, display it. If the login screen is
// displayed, then getting back here means the login in progress did not successfully
// complete. In that case, notify the login view so it can update its UI appropriately.
if (![modalViewController isKindOfClass:[SCLoginViewController class]]) {
SCLoginViewController* loginViewController = [[SCLoginViewController alloc]
initWithNibName:@"SCLoginViewController"
bundle:nil];
[topViewController presentModalViewController:loginViewController animated:NO];
} else {
SCLoginViewController* loginViewController = (SCLoginViewController*)modalViewController;
[loginViewController loginFailed];
}
}
- (void)sessionStateChanged:(FBSession*)session state:(FBSessionState)state error:(NSError*)error
{
switch (state) {
case FBSessionStateOpen: {
UIViewController* topViewController = [self.navigationController topViewController];
if ([[topViewController modalViewController]isKindOfClass:[SCLoginViewController class]]) {
[topViewController dismissModalViewControllerAnimated:YES];
}
}
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[self.navigationController popToRootViewControllerAnimated:NO];
[FBSession.activeSession closeAndClearTokenInformation];
[self showLoginView];
break;
default:
break;
}
if (error) {
UIAlertView* alertView = [[UIAlertView alloc]initWithTitle:@"Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}
}
- (void)openSession
{
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession* session, FBSessionState status, NSError* error){
[self sessionStateChanged:session state:status error:error];}];
}
次に、SCLoginViewController.m に、既存の FBLoginView オブジェクトを使用する代わりに、ログイン ジョブを実行するためのボタンを追加します。そのボタンのハンドラ関数は次のとおりです。
- (IBAction)performLogin:(id)sender {
//[self.spinner startAnimating];
SCAppDelegate* appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate openSession];
}
次に、SCViewController.m に、ログアウト ジョブを実行する別のボタンを追加します。そのボタンのハンドラ関数は次のとおりです。
- (IBAction)logoutButtonWasPressed:(id)sender {
[FBSession.activeSession closeAndClearTokenInformation];
}
その他のコードはサンプルコードとほぼ同じです。