Facebook Connect SSO无法在某些iPhone上运行

时间:2012-08-01 05:07:01

标签: iphone ios facebook single-sign-on

我已根据this教程在我的iphone应用程序中实现了FBConnect SSO。到目前为止,我已经在两部手机上测试了它,其中一部让我可以正常使用这个功能,而另一部手机只是打开Facebook应用程序并立即关闭它。我能够建立一个有效的会话,但对话似乎只关闭了其中一个 可能是什么问题呢?非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

我认为您的问题是您在客户端(您的应用程序)或服务器端(FB应用程序配置)中没有正确的配置。请检查以下内容:

客户端应用

确保您已将正确的FBAppId作为URL处理程序引入Info.plist。 Facebook将尝试使用此处理程序打开该应用程序,如果它不起作用,您的应用程序将无法打开。

Plist Config

(用您的FB appID替换XXXXXXXXXX

检查您的应用(在appDelegate中)是否处理​​上面添加的自定义网址:

- (BOOL)handleOpenURL:(NSURL*)url
{
    NSString* scheme = [url scheme];
    NSString* prefix = [NSString stringWithFormat:@"fb%@", facebookAppId];
    if ([scheme hasPrefix:prefix]) {
        return [fb handleOpenURL:url];
    }
    return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{
    return [self handleOpenURL:url];
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{
    return [self handleOpenURL:url];  
}

服务器端

检查您是否在FB配置页面中正确配置了bundleId。您可以在https://developers.facebook.com/apps,选择您的应用,然后在版本面板中查看此内容:

FB config

如果你正确配置了这两件事,它应该适用于任何情况(安装了FBapp或基于Safari)。

答案 1 :(得分:3)

我在3.0 SDK中看到了这一点。它发生的原因是因为facebook缓存访问令牌的方式。访问令牌缓存在您的应用程序和设备上的Facebook应用程序中(至少在概念上)。

如果这是您第一次在设备上启动应用,则Facebook将不会在您的应用中缓存有效的访问令牌。但是,它可能仍然在您的应用程序的Facebook应用程序中有一个有效的访问令牌。如果它在facebook侧找到一个,那么它不必再次询问用户,因此对话框出现,然后消失,并且它发送回访问令牌。然后,访问令牌将缓存在您的应用中。

如果您重新启动应用程序(不删除它),则根本无法看到登录对话框,因为访问令牌现在已缓存在您的应用程序中。如果你在设备上删除你的应用程序并再次登录,你会看到相同的行为,只要facebook可以找到一个缓存的令牌。

我找到了解决这个问题的方法。以下是一些示例代码:

if (![FBSession activeSession].isOpen) {
    FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:permissions defaultAudience:FBSessionDefaultAudienceEveryone urlSchemeSuffix:nil tokenCacheStrategy:nil];
    [FBSession setActiveSession:session];
    [session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent     completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
// NOTE openActiveSessionWithPermissions causes the facebook app to hang with a blank dialog if my app is installed, authed, and then reinstalled. openWithBehavior
// does not. I think it has something to do with the FBSession activeSession.
//        [FBSession openActiveSessionWithPermissions:self.permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        switch (status) {
            case FBSessionStateOpen:
                [self getFacebookUser];
                break;
            case FBSessionStateClosed:
                [self fbSessionClosed];
                break;
            case FBSessionStateCreated:
                [self fbSessionCreated];
                break;
            case FBSessionStateCreatedOpening:
                [self fbSessionOpening];
                break;
            case FBSessionStateClosedLoginFailed:
                [self fbSessionClosedLoginFailed];
                break;
            case FBSessionStateOpenTokenExtended:
                [self fbSessionOpenTokenExtended];
                break;
            case FBSessionStateCreatedTokenLoaded:
                [self fbSessionCreatedTokenLoaded];
                break;
        }
    }];
}
}

openActiveSessionWithPermissions会导致问题,但openWithBehavior则不会。 openActiveSession进行相同的openWithBehavior调用,但我认为设置活动会话的时间是不同的,因此不起作用。如果我在调用openWithBehavior之前设置了活动会话,那么一切似乎都能正常工作。就您的应用和最终用户而言,一切都是相同的。

答案 2 :(得分:1)

您需要在整个代码中插入合适的日志记录,发布代码,并在工作和失败案例中发布正在进行的日志。

要创建日志(有关更多高级技术,请参阅here):

NSLog(@"My log text");  

至少您需要在所有中添加来自Facebook API的回调(即使是您未使用的回调),以及应用程序委托中的handleOpenURL and openUrl方法中的日志

当您连接正在测试的设备时,您的日志将显示在Xcode Organizer的控制台中 - 这应该会告诉您正在发生的事情。

仅供参考,Facebook SDK代码将首先尝试使用本机应用程序(如果已安装),否则它将启动Safari浏览器以通过Facebook的Web版本请求授权。

你应该仔细检查你的Facebook URL方案配置,如AngelGarcíaOlloqui的回答所述。