Objective C を使用して IOS5.1 アプリを開発しています。アプリケーションのログイン機能用に、ネイティブ IOS アプリhttp://developers.facebook.com/docs/reference/iossdk/authentication/に facebook SSO を実装しました。
私のアプリの流れは loginViewController から始まります。ユーザーがアプリのログイン ボタンをクリックすると、アプリは isSessionValid() をチェックします。メソッドが true を返す場合、ユーザーは次のページに移動します。プロビジョニングされた電話でのシミュレーション中に、現在のアプリは、モバイル サファリ Web ブラウザー (Facebook アプリがない場合) または Facebook アプリのいずれかに誘導できます。isSessionValid() は true を返し、Safari Web ブラウザー経由でログインすると、次のビュー ページに移動します。ただし、プロビジョニングされた Iphone に Facebook アプリがある場合、アプリケーションでログイン ボタンをクリックすると Facebook アプリが表示されます。Facebook アプリは、アクティビティ インジケーター「読み込み中...」を含む白いページを表示し、アプリケーションに戻るように指示します。ログインボタンをもう一度クリックすると、Facebookアプリが再びポップアップします。これが無限ループになります。
これが私のコードです:
AppDelegate.h で:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
NSMutableDictionary *userPermissions;
}
@property (nonatomic, retain) Facebook *facebook;
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) LoginViewController *loginvc;
AppDelegate.m で:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
self.loginvc = [storyboard instantiateInitialViewController];
self.window.rootViewController = loginvc;
facebook = [[Facebook alloc] initWithAppId:@"facebookID" andDelegate:self.loginvc];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"]) {
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
}
// Initialize user permissions
userPermissions = [[NSMutableDictionary alloc] initWithCapacity:1];
[self.window makeKeyAndVisible];
return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [self.facebook handleOpenURL:url];
}
LoginViewController.m で:
- (IBAction)loginViaFacebook:(id)sender
{
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
if (![[delegate facebook] isSessionValid]) {
[[delegate facebook] authorize:permissions];
} else {
[self performSegueWithIdentifier:@"signup" sender:self];
}
}
- (void)fbDidLogin {
AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[[delegate facebook] accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[[delegate facebook] expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
}
... 必要な Facebook プロトコルはすべて LoginViewController.m に実装されています。
ストーリーボードを使用しています。ストーリーボードで使用される開始 ViewController は LoginViewController です。モバイルサファリWebブラウザ経由でログインするときにFacebook ssoが機能するのは確かですが、Facebookアプリ経由では機能しません。
誰かが答えを知っていることを願っています。ありがとうございました!