0

我正在使用 Objective C 开发一个 IOS5.1 应用程序。我已经为本地 IOS 应用程序http://developers.facebook.com/docs/reference/iossdk/authentication/为我的应用程序登录功能实现了 facebook SSO。

我的应用程序的流程从 loginViewController 开始。当用户在我的应用程序中单击登录按钮时,应用程序将检查 isSessionValid()。如果该方法返回 true,用户将被引导到下一页。在配置的手机上进行模拟期间,我当前的应用程序能够将我定向到移动 safari 网络浏览器(如果没有 facebook 应用程序)或 facebook 应用程序。当我通过 safari Web 浏览器登录时,isSessionValid() 返回 true 并将我定向到下一个视图页面。但是,如果配置的 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。我确定当通过移动 safari 网络浏览器登录但不是通过 facebook 应用程序登录时 facebook sso 工作。

希望有人知道答案。谢谢!

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 回答