アプリを Facebook SDK 2 から 3.1 にアップグレードしました。
RecordsScreen に投稿ボタンがあります。ユーザーが Facebook にログインしていない場合は、ログイン ページが表示され、ユーザーが既にログインしている場合は、別の nib が読み込まれ、ユーザーが自分のウォールに投稿するメッセージを入力するように求められます。
すでにログインしています。その後、投稿ボタンをクリックするたびに、アプリに関するページが既に承認されており、[OK] をクリックして続行するかどうかを確認するページが表示されます。[OK] をクリックすると、アプリが終了し、最初から起動し直します。投稿ボタンをクリックするたびに、この同じページが再び表示されます。有効なセッションが見つからないか、トークンが失われているようです。
これをシミュレーターとデバイスでテストしました。同じことが起こります。展開対象はiOS5.1です。
入力していない唯一のパラメーターは、iPhone App Store ID です。これは上記の動作に影響しますか?
私はすでに何度も試しましたが、解決策を見つけることができませんでした。
どんな助けでも大歓迎です。
ありがとう!
aobs
1月4日に編集:
openSessionWithAllowLoginUI が呼び出されるたびにわかりました。状態 FBSessionStateClosedLoginFailed が返されます。ログインに問題があります。ただし、Already Authorized ページが表示されるため、ユーザーはすでにログインしています。
その理由は、applicationWillTerminate が openSessonWithAllowLoginUI の直後に実行されるためです。誰でもこれに光を当てることができますか?
appDelegate.h で FacebookSDK/FacebookSDK.h をインポートし、appDelegate.m で次のように実装します。
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [FBSession.activeSession handleOpenURL:url);
}
-(void)applicationDidBecomeActive:(UIApplication *)application {
[FBSession.activeSession handleDidBecomeActive];
}
-(void)applicationWillTerminate:(UIApplication *)application {
[FBSession.activeSession close];
}
mainViewController は、ペン先を切り替えるマルチビュー コントローラーです。
Facebook のログイン/ログアウトを処理するクラス FBHandler を実装しました。FBHandler.h には #import "Facebook.h" が含まれており、FBHandler は次を含むクラスです。
-(void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error {
switch(state) {
case FBSessionStateOpen:
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[FBSession.activeSession closeAndClearTokenInformation];
default:
break;
}
[[NSNotificationCenter defaultCenter]postNotificationName:FBSessionStateChangedNotification object:session];
// If there is an error, display the alert view. I have skipped this code.
}
-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
[self sessionStateChanged:session state:state error:error];
}];
}
nib の 1 つである RecordsScreen.xib には、Facebook のログイン/ログアウト ボタンが含まれています。RecordsScreen.m (ユーザーが自分のスコアを確認し、Facebook からログインまたはログアウトできる場所) で、viewDidLoad に以下が追加されます。
fbHandler = [[FBHandler alloc] init];
[fbHandler openSessionWithAllowLoginUI:NO];
// Also, we will listen to FBSessionStateChangedNotification in viewDidLoad. Code is skipped here.
// The implementation of sessionStateChanged in RecordsScreen:
-(void)sessionStateChanged:(NSNotification *)notification {
if (FBSession.activeSession.isOpen) {
if (self.facebook == nil) {
self.facebook = [[Facebook alloc]initWithAppId:FBSession.activeSession.appID andDelegate:nil];
self.facebook.accessToken = FBSession.activeSession.accessToken;
self.facebook.expirationDate = FBSession.activeSession.expirationDate;
}
} else {
self.facebook = nil;
}
}
RecordsScreen.m で、ユーザーがログイン ボタンをクリックすると、
if (!FBSession.activeSession.isOpen) {
// Login to Facebook.
[fbHandler openSessionWithAllowLoginUI:YES];
} else {
// If user is login, post to wall.
[self postScoreToWall];
}