FBConnect
根据本教程,我已经在我的 iphone 应用程序中实现了 SSO。到目前为止,我已经在两部手机上对其进行了测试,其中一部让我可以很好地使用该功能,而另一部手机只是打开 Facebook 应用程序并立即关闭它。我能够建立一个有效的会话,但对话似乎只是在其中一个上关闭了我。
可能是什么问题呢?任何帮助深表感谢。
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中检查这一点,选择您的应用程序,然后在编辑面板中:
如果您正确配置了这两件事,它应该在任何情况下都可以工作(安装了 FBapp 或基于 Safari)。
我已经在 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 之前设置活动会话,一切似乎都正常。就您的应用程序和最终用户而言,一切都是相同的。
您需要在整个代码中插入合适的日志记录,发布代码,并发布在工作和失败案例中生成的日志。
要制作日志(有关更高级的技术,请参见此处):
NSLog(@"My log text");
至少,您需要在来自 Facebook API 的所有回调(甚至是您未使用的回调)以及应用程序委托的handleOpenURL 和 openUrl方法中添加日志。
当您连接您正在测试的设备时,您的日志将出现在 Xcode Organizer 的控制台中 - 这应该会告诉您正在发生的事情。
仅供参考,如果已安装,Facebook SDK 代码将首先尝试使用本机应用程序,否则它将启动 Safari 浏览器以通过网络版 Facebook 请求授权。
您应该仔细检查您的 Facebook URL 方案配置,如 Angel García Olloqui 的回答中所述。