0

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アプリ経由では機能しません。

誰かが答えを知っていることを願っています。ありがとうございました!

4

1 に答える 1

0

Facebook ドキュメント ( https://developers.facebook.com/docs/mobile/ios/build/#implementsso ) の SSO 実装によると、これを AppDelegate.h デリゲートに実装する必要があります。

@interface AppDelegate : UIResponder <UIApplicationDelegate,UIApplicationDelegate, FBSessionDelegate>

これが役立つことを願っています。

于 2012-08-11T22:57:48.967 に答える