2012-08-01 79 views
6

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

+0

这也发生在我身上..检查FBapp ID是否设置正确 – iMeMyself 2012-08-01 06:47:36

+0

我会研究它。我认为这与一部手机安装了Facebook应用程序而另一部没有安装Facebook应用程序有关。 – 2012-08-01 06:55:36

+0

你的意思是说FB SDK? – iMeMyself 2012-08-01 07:32:59

回答

3

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

客户端应用程序:

确保您已经介绍了正确的FBAppId到您的Info.plist作为URL处理。 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]; 
} 

服务器端

检查您是否正确配置了您的bundl在FB配置页面中输入。您可以在https://developers.facebook.com/apps检查,请选择您的应用程序,然后在编辑面板:

FB config

如果你有两件事正确配置,它应该在任何情况下工作(安装了FBapp或Safari浏览器为基础)。

+0

感谢您的详细答案,我只是更新,Facebook的样品,以及存在的问题存在。你可以在设备上自己测试它。 – zakishaheen 2012-09-07 14:28:44

+0

请参阅https://developers.facebook.com/bugs/361792887232488?browse=search_504a052eac5980628824152 – zakishaheen 2012-09-07 14:32:05

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之前设置活动会话,一切似乎都正常。就你的应用和最终用户而言,一切都是一样的。

+0

如果您有iOS SDK 6.0,则尤其如此,那么应用程序根本无法打开。 – 2012-09-07 08:17:39

+0

我已经找到了解决这个问题的办法@JoakimEngstrom。 – 2012-10-01 05:54:28

+0

但是这种方法不会使用Facebook SDK 3.1中引入的本地登录。但它的工作。 – 2012-10-01 09:04:46

1

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

为了使日志(请参阅here为更先进的技术):

NSLog(@"My log text"); 

在你需要从Facebook的API(在添加记录所有的回调最低甚至那些你不使用)以及应用程序委托中的handleOpenURL and openUrl方法。

当您连接正在测试的设备时,您的日志将出现在Xcode管理器的控制台中 - 这应该会告诉您发生了什么。如果已安装,Facebook SDK代码将首先尝试使用本机应用程序,否则它将启动Safari浏览器以通过Facebook的Web版本请求授权。

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

+0

我知道。问题是我的应用程序调用Facebook API非常好。登录发生,FB应用程序不会调用我自己的应用程序。 Facebook样本也是如此。 – zakishaheen 2012-09-07 14:30:08