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 在没有 FBWebDialogResult 的情况下发布到墙上
读取权限后直接请求发布权限 - 适用于 iOS 6 的 Facebook SDK
Facebook iOS SDK:应用程序在以“未找到符号:_ACFacebookAppIdKey”开始后立即崩溃。仅在 iOS 5 中