我已根据this教程在我的iphone应用程序中实现了FBConnect
SSO。到目前为止,我已经在两部手机上测试了它,其中一部让我可以正常使用这个功能,而另一部手机只是打开Facebook应用程序并立即关闭它。我能够建立一个有效的会话,但对话似乎只关闭了其中一个
可能是什么问题呢?非常感谢任何帮助。
答案 0 :(得分:3)
我认为您的问题是您在客户端(您的应用程序)或服务器端(FB应用程序配置)中没有正确的配置。请检查以下内容:
客户端应用
确保您已将正确的FBAppId作为URL处理程序引入Info.plist。 Facebook将尝试使用此处理程序打开该应用程序,如果它不起作用,您的应用程序将无法打开。
(用您的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,选择您的应用,然后在版本面板中查看此内容:
如果你正确配置了这两件事,它应该适用于任何情况(安装了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的回答所述。