6

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

4

3 回答 3

3

我认为您的问题是您没有正确的配置,无论是在客户端(您的应用程序)还是在服务器端(FB 应用程序配置)。请检查以下两项:

客户端应用:

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

列表配置

(替换为XXXXXXXXXX您的 FB appID)

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

- (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 配置

如果您正确配置了这两件事,它应该在任何情况下都可以工作(安装了 FBapp 或基于 Safari)。

于 2012-08-31T14:48:02.587 回答
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 之前设置活动会话,一切似乎都正常。就您的应用程序和最终用户而言,一切都是相同的。

于 2012-09-03T20:18:04.100 回答
1

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

要制作日志(有关更高级的技术,请参见此处):

NSLog(@"My log text");  

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

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

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

您应该仔细检查您的 Facebook URL 方案配置,如 Angel García Olloqui 的回答中所述。

于 2012-09-04T19:21:41.897 回答