2009-11-15 76 views
4

我正在使用Facebook Connect for iPhone并遵循official instructions。我用下面的代码来显示登录对话框:(请注意,结果都是一样的,当我与FBLoginButton办法去直接显示在对话框代替)Facebook连接登录对话框不起作用

FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:session] autorelease]; 
[dialog show]; 

该对话框会弹出预计,但正如你在下面的截图中看到的,它太大了,看起来像完整的Facebook主页。我可以平移对话框以显示登录按钮,但是一旦我登录,它就会继续显示对话框中的常规Facebook页面。它永远不会调用我的session:didLogin回调。

有什么我做错了吗?

alt text http://img.skitch.com/20091115-t24w7p5gpa6iqgehjdc4f1awfs.jpg

回答

5

我终于想通了......我正在初始化FBSession在我的应用代理的applicationDidFinishLaunching方法中。然后我在视图控制器的viewDidAppear中触发了Facebook登录代码。

然而,applicationDidFinishLaunching是这样的:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    [window addSubview:viewController.view]; 
    [window makeKeyAndVisible]; 

    self.session = [FBSession sessionForApplication:FB_API_KEY secret:FB_APP_SECRET delegate:self]; 
} 

这意味着我是显示窗口,我初始化FBSession面前,显然是一个零会话导致我上述的行为。在更改applicationDidFinishLaunching以首先创建FBSession之后,所有内容现在都按预期工作。 Doh ...;)

0

我还没有与FaceBook的API库的工作,但你尝试发送show消息之前改变dialog.frame

+0

更改对话框的框架不起作用。另外请注意,当使用FBLoginButton方法时,这甚至不是一个选项,因为这会在内部弹出对话框。 对话框本身具有正确的大小。只是它的内容(可能是网络视图)是错误的。 – 2009-11-15 18:21:30

+0

此外,它不仅仅是登录对话框的大小,还有行为。这就像它只是显示一个普通的Facebook网站,而不是预期的登录对话框。 – 2009-11-15 18:38:36

0

你在设备上试过这个吗?你的操作系统是什么?我使用几乎相同的调用,没有任何问题(-init,与initWithSession)。另外,我假设你有一个窗口和视图体系结构已经设置在这背后,对吗?

+0

是的,我已经设置了窗口和视图(使用基于视图的应用程序模板)。我试着针对3.0和3.1.2构建模拟器和实际设备。但看到我的答案。事实证明,当我显示登录对话框时,我还没有初始化FBSession。 – 2009-11-16 00:54:51

0

我只有这个问题,只有设备,而不是在模拟器上。显然,Facebook页面正在使用设备的用户代理来呈现正确的页面。如果你愿意,你应该能够通过添加一个用户代理头来改变FB Connect的Web View所做的http调用。

+0

我在设备和模拟器上都获得了相同的行为。我正在使用Facebook Connect for iPhone,这似乎并不能让我访问诸如用户代理之类的底层HTTP标头。 – 2009-11-16 00:44:31

+0

我只是拉起我的代码,看到我为同样的问题写了一个解决方法。基本上问题是Facebook连接希望你在应用中放置一个FBLoginButton,然后打开登录对话框。我的解决方法以下面的答案发布。 – 2009-11-16 20:27:54

1

谢谢米尔科,我有完全相同的问题,但通过不同的实现达成。以下是事实:

  • 问题在模拟器和物理设备上是一样的。错误的用户代理是红鲱鱼。 (或通过FBLoginDialog或使用FBLoginButton)显示对话框之前,必须已建立会话(可通过“[[FBSession sessionForApplication:kApiKey secret:kApiSecret delegate:self] retain];”或代理方法) 。或者在已经存在的会话上调用[会话继续]。
  • 显示对话框之前会话对象的状态不起作用。只要我已经调用上述方法建立会话,我可以执行“session = nil”或“[session logout]”,并且我仍然可以获得正确的对话框。如果我没有先建立我的会话,我会得到错误的完整主页效果。
+0

感谢您的补充信息。因此,传递给FBLoginDialog的实际FBSession对象并不重要,但是是否调用了建立会话的任何方法。很高兴知道。 – 2009-11-16 18:40:05

0

我刚刚拉起我的代码,看到我写了一个解决方法同样的问题。基本上问题是Facebook连接希望你在应用中放置一个FBLoginButton,然后打开登录对话框。为了显示没有按钮的对话框,我这样做了:

faceBookSession = [FBSession sessionForApplication:kFacebookAPIKey secret:kFaceBookAPISeceret delegate:self]; 
    if (![faceBookSession resume]) { 
     FBLoginButton *button = [[FBLoginButton alloc] init]; 
     [button performSelector:@selector(touchUpInside)]; 
     [button release]; 
    } 
+0

您不应该需要此解决方法。根据我自己的回答以及“未知(谷歌)”的答案,您需要确保的唯一的事情是在尝试显示登录对话框之前调用其中一种方法来创建FBSession。一旦你这样做,你可以直接显示FBLoginDialog(使用我原来的问题代码)或使用FBLoginButton。您无需创建虚拟按钮并模拟点击它。 – 2009-11-17 18:46:15