我一直在将我的应用程序从旧的 Facebook SDK 转换为新的 Facebook SDK 3.1,以便使用 iOS6 原生功能以及其他 Facebook 功能,但我遇到了一个在模拟器上始终如一且很少在设备上发生的问题。
当我登录 Facebook 时,不是通过 Safari 或 Facebook 应用程序进行后台和身份验证,而是在我的应用程序顶部获得一个用于登录的模式窗口(我相信这始于 iOS6,甚至在切换到 Facebook SDK 3.0 之前/3.1)。这个窗口允许我输入用户名和密码,但是当我点击右上角的“确定”进行身份验证时,什么也没有发生。AppDelegate 中的 application:openURL:sourceApplication:annotation: 不会发生回调。
在我共享的 FacebookController 代码(我用于多个项目)中,我在尝试根据 Facebook 的示例代码进行授权时初始化 FBSession:
FBSession *session = [[FBSession alloc] initWithAppID:nil permissions:readPermissions defaultAudience:FBSessionDefaultAudienceNone urlSchemeSuffix:self.fbUrlSchemeSuffix tokenCacheStrategy:nil];
if(session.state == FBSessionStateCreated || session.state == FBSessionStateCreatedTokenLoaded)
{
[FBSession setActiveSession:session];
// we open after the fact, in order to avoid overlapping close
// and open handler calls for blocks
[session openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
...
除非我单击对话框上的 x 取消按钮,否则永远不会执行完成处理程序的代码(在这种情况下,我会收到预期的错误)。
我在我的 iOS 目标属性 (info.plist) 中设置 FacebookAppID,并且我还使用 fb###[url_scheme_suffix] 设置了 URL 方案。
我的代码和 Facebook 示例代码之间的唯一区别是我使用的是 url 方案后缀,因为我有我们的应用程序的免费和付费版本。
如果应用程序使用 Safari 登录,它将使用给定的代码。如果它快速切换到 Facebook 应用程序,它也可以工作。此外,共享的 facebook ios6 帐户设置工作。该应用仅在使用应用内模式时才会失败。
有人遇到过这种情况么?