Facebook SDK 3.2 登录仅在应用程序未终止时才有效

Posted

技术标签:

【中文标题】Facebook SDK 3.2 登录仅在应用程序未终止时才有效【英文标题】:Facebook SDK 3.2 login only works if app does not terminate 【发布时间】:2013-04-06 01:05:00 【问题描述】:

我的 Facebook 登录只有在没有退出应用程序才能登录时才有效。例如,它仅在应用程序使用 ios6 原生对话框或强制 Web 视图登录时才有效。当我尝试使用 safari 或 Facebook 应用程序登录时,它会显示一个页面,显示我已经授权了该应用程序。我单击“确定”,然后它带我回到我的应用程序,但登录没有完成。

有什么想法吗?卡在这上面很久了……

提前致谢!

以下是我用来登录的代码。如果我强制使用 Web 视图,则登录将起作用,因为它不必切换出应用程序即可登录,但似乎每次都为用户这样做要非常高效。

 FBSession *session =
[[FBSession alloc] initWithAppID:@"12345"
                     permissions:nil
                 urlSchemeSuffix:@"paid"
              tokenCacheStrategy:nil];

if (allowLoginUI ||
    (session.state == FBSessionStateCreatedTokenLoaded)) 
    [FBSession setActiveSession:session];
    [session openWithBehavior:FBSessionLoginBehaviorWithFallbackToWebView
            completionHandler:
     ^(FBSession *session, FBSessionState state, NSError *error) 
         [self sessionStateChanged:session state:state error:error];
     ];
    result = session.isOpen;

【问题讨论】:

你能显示一些代码吗? @FabioCardoso 我在上面添加了我的登录代码 基本上,当我返回我的应用程序时,永远不会调用完成处理程序 在 IF 语句中不带 allowLoginUI 试试看。 @FabioCardoso 没有allowLoginUI,它什么也做不了。如果我将“应用程序不在后台运行”设置为否,似乎可以登录。因此,如果应用程序是多任务处理,它会工作,但我希望它无需打开多任务处理即可工作。 【参考方案1】:

您是否在您的应用委托中实现了- application:openURL:sourceApplication:annotation:,声明了对 URL 方案 fb[YOUR APP ID] 的应用支持并进行了连接,以便应用委托调用最终到达 [[FBSession activeSession] handleOpenURL:url]

外部 Web 视图的工作方式是,如果登录成功,则它会尝试使用包含登录令牌的特定于应用程序的方案打开一个 URL。您应该已将您的应用设置为 URL 方案的处理程序,然后将相关 URL 传递到 Facebook SDK 以便它可以解码令牌。

【讨论】:

是的,当它再次打开应用程序并返回一个 access_Token 时,我在 URL 上做了一个 NSLog。 handleOpenURL:的返回结果是什么? [FBSession activeSession] 一定会返回非nil 吗? handleOpenURL 返回 fb[app_id]://authorize/#access_token=[access_token] 并且activeSession 不为零 如果我将“应用程序不在后台运行”设置为否,似乎可以登录。因此,如果应用程序是多任务处理,它会工作,但我希望它无需打开多任务处理即可工作。 handleOpenURL 被定义为返回 BOOL — 参见 FBSession.h 的第 425 行。您确定您使用的是正确的入口点吗?【参考方案2】:

您可以尝试在您的 AppDelegate 实现文件中添加以下方法吗? (假设你还没有):

//
// During the Login with FB flow, the app passes control to the Facebook iOS app or Facebook in mobile Safari.
// After the user is authenticated, the app will be called back with the session information.
// This method calls the Facebook session object that handles the incoming URL.
//
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *) sourceApplication annotation:(id)annotation

    return [FBSession.activeSession handleOpenURL:url];

【讨论】:

是的,我已经在调用 handleOpenURL 我做了一个 URL 的 NSLog,它返回应用程序 ID 和 access_token。

以上是关于Facebook SDK 3.2 登录仅在应用程序未终止时才有效的主要内容,如果未能解决你的问题,请参考以下文章

Facebook iOS SDK 3.2 获取用户新闻提要

Facebook iOS sdk 3.2 在没有 FBWebDialogResult 的情况下发布到墙上

facebook分享问题,登录方式如何影响分享行为?

读取权限后直接请求发布权限 - 适用于 iOS 6 的 Facebook SDK

Facebook iOS SDK:应用程序在以“未找到符号:_ACFacebookAppIdKey”开始后立即崩溃。仅在 iOS 5 中

Facebook api ios-sdk,代表不工作,没有调用 fbDidLogin