我在我的应用程序中实现了Facebook Connect,就像Facebook提供的示例应用程序一样,效果很好。在用户选择通过Facebook共享数据后,他们将进入新视图并显示FB登录对话框。用户完成后,退出FB共享视图并返回到我应用程序的上一个视图。用户只要不注销就会保持登录状态 - 即使他们退出FB共享视图也是如此。这很好,正如预期的那样。
我使用与示例SessionViewController.m相同的viewDidLoad方法,这是初始化_session的地方:
- (void)viewDidLoad {
[_session resume];
_loginButton.style = FBLoginButtonStyleWide;
}
但是我注意到,如果用户在退出并重新加载FB共享视图后按下Logout按钮,它将抛出SIGABRT或EXC_BAD_ACCESS并使应用程序崩溃。 EXC_BAD_ACCESS错误发生在Login按钮的touchUpInside方法的[dialog show]行:
- (void)touchUpInside {
if (_session.isConnected) {
[_session logout];
} else {
FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
[dialog show];
}
即使用户已连接,touchUpInside方法也会看到断开连接的会话...有时而不是在按下“注销”按钮后崩溃,注销将成功,但视图的状态文本仍为“登录为...”并且设置状态/上传图像按钮未隐藏。尝试再次登录会抛出一个SIGABRT,它看起来是由于FBRequest.m中的nil _session.sessionKey:344:
[_params setObject:_session.sessionKey forKey:@"session_key"];
我是否应该在视图更改中保留或执行不同的操作?
编辑:我发现另一位用户在Facebook开发者论坛上遇到同样的问题: http://forum.developers.facebook.com/viewtopic.php?pid=193727#p193727
没有发布解决方案,但如果找到一个,我会更新此问题。
答案 0 :(得分:0)
_session在那时是零,对(这与“总是显示未连接”一致)。你在哪里初始化_session?
ETA:这是你的代码,取代了Facebook Connect提供的SessionViewController,对吗?
我无法弄清楚_session是如何被释放的,但这就是它的样子。
添加:
您可能希望将按钮处理程序更改为
[_ session resume];
然后在didLogin委托处理程序中执行您需要执行的操作。这样_session就会为你实例化FBLoginDialog。