Facebook Connect登录对话框无效

时间:2009-11-15 17:49:02

标签: iphone facebook

我正在使用Facebook Connect for iPhone并遵循official instructions。我使用以下代码显示登录对话框:

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

(请注意,当我使用FBLoginButton方法而不是直接显示对话框时,结果是相同的。)

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

我有什么问题吗?

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

6 个答案:

答案 0 :(得分:5)

我终于想通了......我正在初始化我的app delegate的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之前显示窗口,显然nil会话导致我上面描述的行为。更改applicationDidFinishLaunching以首先创建FBSession后,现在所有内容都按预期工作。 Doh ......;)

答案 1 :(得分:1)

感谢Mirko,我遇到了完全相同的问题但通过不同的实现达成了问题。以下是事实:

  • 模拟器和物理设备上的问题是相同的。错误的用户代理是红鲱鱼。
  • 在显示对话框之前(直接通过FBLoginDialog或使用FBLoginButton),您必须已建立会话(通过“[[FBSession sessionForApplication:kApiKey secret:kApiSecret delegate:self] retain];”或代理方法。或者在现有会话上调用[会话简历]。
  • 显示对话框之前会话对象的状态无效。只要我调用上面的方法来建立我的会话,我就可以做“session = nil”或“[session logout]”,我仍然得到正确的对话框。如果我没有先建立我的会话,我会得到错误的完整主页效果。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您是否在设备上试过这个?你在构建什么操作系统?我正在使用几乎相同的调用而没有问题(-init,vs。initWithSession)。另外,我假设你已经设置了一个窗口和视图架构,这是正确的吗?

答案 4 :(得分:0)

我只有这个问题,只有设备,不在模拟器上。显然,Facebook页面正在使用设备的用户代理来呈现正确的页面。如果您愿意,您应该可以通过向FB Connect的Web视图正在进行的http调用添加用户代理标题来更改它。

答案 5 :(得分: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];
    }