Facebook连接登录对话框无法使用。

4
我正在使用Facebook Connect for iPhone,并遵循官方说明。我使用以下代码显示登录对话框:
FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:session] autorelease];
[dialog show];

(请注意,当我采用FBLoginButton方法而不是直接显示对话框时,结果是相同的。)
对话框如预期一样弹出,但是如下面截图所示,它太大了,看起来像完整的Facebook首页。我可以平移对话框以显示登录按钮,但是一旦我登录,它就会在对话框内显示常规的Facebook页面。它从未调用我的session:didLogin回调函数。
我是否做错了什么? alt text http://img.skitch.com/20091115-t24w7p5gpa6iqgehjdc4f1awfs.jpg
6个回答

5

我终于弄明白了……我在我的应用程序委托的applicationDidFinishLaunching方法中初始化了FBSession。然后,我在我的视图控制器的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 之前,我已经显示了窗口,很明显一个空的 session 会导致上述所描述的行为。将 applicationDidFinishLaunching 更改为首先创建 FBSession 后,现在一切都按预期工作了。唉... ;)

1

谢谢Mirko,我也碰到了完全相同的问题,但是通过不同的实现方法解决了。以下是一些事实:

  • 这个问题在模拟器和物理设备上都是一样的。错误的用户代理并不是关键。
  • 在显示对话框之前(无论是直接使用FBLoginDialog还是使用FBLoginButton),您必须已经建立了会话(通过“[[FBSession sessionForApplication:kApiKey secret:kApiSecret delegate:self] retain];”或代理方法)。或者在一个已经存在的会话中调用[session resume]。
  • 在显示对话框之前的会话对象状态没有影响。只要我先调用了上面的方法来建立我的会话,我可以做“session = nil”或“[session logout]”,仍然可以获得正确的对话框。如果我没有先建立我的会话,我就会得到错误的完整主页效果。

感谢提供的额外信息。因此,传递给FBLoginDialog的实际FBSession对象并不重要,而是调用了建立会话的任何方法。好的,我们知道了。 - Mirko Froehlich

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];
    }

你不应该需要这个解决方法。根据我自己在上面的回答以及“unknown(google)”的回答,你需要确保在尝试显示登录对话框之前调用其中一个方法来创建FBSession。一旦你这样做了,你可以直接显示FBLoginDialog(使用我原始问题中的代码)或使用FBLoginButton。你不需要创建一个虚拟按钮并模拟点击它。 - Mirko Froehlich

0

我没有使用过FaceBook API库,但是你尝试在发送show消息之前更改dialog.frame了吗?


更改对话框的框架没有任何效果。还要注意,当使用FBLoginButton方法时,这甚至不是一个选项,因为它在内部弹出对话框。对话框本身具有正确的大小。只是它的内容(可能是一个Web视图)是错误的。 - Mirko Froehlich
此外,问题不仅仅在于登录对话框的大小,还关乎其行为。它似乎只是显示了一个普通的 Facebook 网站,而不是预期的登录对话框。 - Mirko Froehlich

0
你在设备上试过这个吗?你正在构建哪个操作系统?我使用了一个几乎相同的调用,没有任何问题(-init与initWithSession)。此外,我假设你已经在这背后设置好了窗口和视图架构,对吗?

是的,我已经使用基于视图的应用程序模板设置了窗口和视图。我尝试在3.0和3.1.2上构建,包括模拟器和实际设备。但请看我的答案。事实证明,在显示登录对话框时,我还没有初始化FBSession。 - Mirko Froehlich

0

我只在设备上遇到了这个问题,模拟器上没有。显然,Facebook页面使用设备的用户代理来呈现正确的页面。如果您想要的话,可以通过向FB Connect的Web View所做的http调用添加用户代理标头来更改它。


我在设备和模拟器上都遇到了相同的问题。我正在使用Facebook Connect for iPhone,但似乎无法让我访问底层的HTTP头,例如用户代理。 - Mirko Froehlich
我刚刚打开了我的代码,发现我为同样的问题编写了一个解决方法。基本上,问题是Facebook连接希望您在应用程序中放置一个FBLoginButton,然后打开登录对话框。我的解决方法已发布在下面的答案中。 - Brad The App Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接