ios6 facebook集成登录始终 FBSessionStateClosedLoginFailed 从不打开
Posted
技术标签:
【中文标题】ios6 facebook集成登录始终 FBSessionStateClosedLoginFailed 从不打开【英文标题】:ios6 facebook integration login always FBSessionStateClosedLoginFailed never opens 【发布时间】:2012-09-30 12:02:02 【问题描述】:这个问题与Facebook SDK for ios , on iOS 4.0 device 非常相似,但由于我无法在那里制作 cmets,因此我提出了一个新问题。我认为问题不一样:
当尝试将我的应用程序的 facebook 集成更新到 facebook 3.1 时,我没有让 facebook 会话打开 sessionStateChanged 回调总是以 FBSessionStateClosedLoginFailed 结束。在我的设置中,我的 appdelegate 中有回调
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
// attempt to extract a token from the url
// return [self.session handleOpenURL:url];
return [FBSession.activeSession handleOpenURL:url];
但它永远不会被调用!它不应该被调用吗?我遵循了 facebook 文档并致电
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
NSArray *permissions = [NSArray arrayWithObjects:@"publish_actions", nil];
return [FBSession openActiveSessionWithPublishPermissions:permissions
defaultAudience:FBSessionDefaultAudienceFriends
allowLoginUI:allowLoginUI
completionHandler:^(FBSession *session,
FBSessionState state,
NSError *error)
[self sessionStateChanged:session
state:state
error:error];
];
我也试过
openActiveSessionWithReadPermissions
和 nil
用于获取 facebook 教程示例中的权限,以便稍后重新授权 publish_actions 权限。同样的结果:再次出现 FBSessionStateClosedLoginFailed。
我什至试过打电话
ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) &&
(accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) )
NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
id account;
if (fbAccounts && [fbAccounts count] > 0 &&
(account = [fbAccounts objectAtIndex:0]))
[accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error)
//we don't actually need to inspect renewResult or error.
if (error)
];
在尝试打开会话之前,但我从来没有在我的 ios6 设备 (iphone 4s) 上打开它。在应用程序中,我被要求获得许可,但由于会话始终处于状态 FBSessionStateClosedLoginFailed,所以什么也没有发生!我对会话状态的回调是
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
switch (state)
case FBSessionStateOpen:
if (!error)
// We have a valid session
NSLog(@"User session found");
break;
case FBSessionStateClosed:
NSLog(@"FBSessionStateClosed");
case FBSessionStateClosedLoginFailed:
NSLog(@"FBSessionStateClosedLoginFailed");
[FBSession.activeSession closeAndClearTokenInformation];
break;
default:
break;
[[NSNotificationCenter defaultCenter]
postNotificationName:FBSessionStateChangedNotification
object:session];
if (error)
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"facebook Hinweis"
message:@"facebook Login nicht möglich, bitte versuchen Sie es erneut."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
NSLog(@"Facebook session error: %@", error.localizedDescription);
在 ios 5 上使用 facebook 3.0 我从来没有遇到过问题,因此我的 facebook 应用程序设置正确。我真的很感激任何帮助,让我能够打开 facebook 会话,没想到会遇到 facebook 3.1 的这些问题,并且文档在这一点上没有帮助我,谢谢
【问题讨论】:
请注意:它在 Xcode 的 ios6 和 ios5 模拟器上完美运行。仅在真实设备上它不会像描述的那样打开。设备已启用 facebook,已安装 facebook 并已连接到 facebook 帐户。 我有一个比你更奇怪的问题,在 iphone 上可以工作,在 ipad 上不行。一样的代码,是通用的app,fb逻辑上没有条件。 我也有同样的问题。你已经解决了吗? 【参考方案1】:我也遇到了同样的问题,是因为我忘记实现了
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
return [FBSession.activeSession handleOpenURL:url];
在我的 AppDelegate 中
【讨论】:
这就是我需要的修复。太容易被忽视了。谢谢!【参考方案2】:虽然 JohnG 的回答是正确的,但该特定委托方法现在已成为 deprecated。使用is this的正确委托方法:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [FBSession.activeSession handleOpenURL:url];
将它放在我的应用程序委托中为我解决了这个问题。没有这个,iOS 6.0 原生登录会起作用,但 Facebook 应用登录会失败。
【讨论】:
谢谢@jzn,但在我的情况下,你提到的委托方法没有被调用。有任何想法吗?谢谢。 @dredful 该回调仅用于 Facebook 应用程序/网络视图后备登录。如果您使用的是 iOS 6 登录,它将永远不会被调用,因为应用程序永远不会进入后台。你用哪种方式登录? 谢谢@jzn。我们的应用程序使用 Facebook 应用程序登录。如果用户没有安装 Facebook,则启动 web 视图然后触发。奇怪的是:如果用户是 iOS6 设置登录到 Facebook,SDK 将不会登录,无论任何其他情况。我今天将发布到 SO。 天啊。您是否看到在 Facebook 的文档“配置 XCode”部分中没有提到这种方法?以前是…… @AndreiStanescu 它仍然是必需的功能,它只是在说明的单独部分中。查看Authenticate Using Facebook Login中的第 2D 步【参考方案3】:我遇到了同样的问题。如果用户没有在系统偏好设置中配置 Facebook 帐户,则会出现 Facebook 登录对话框,并且一切正常。但是,如果用户在设备中配置了一个帐户,我总是会遇到 FBSessionStateClosedLoginFailed
错误。
它与handleOpenURL:url
无关,因为在 iOS 6 或更高版本的“本机登录流程”中没有快速应用程序更改。所以你的应用永远不会进入后台,也不需要 URL 重定向。
问题已解决,配置 Facebook 应用程序。您需要启用“本机 iOS 登录”部分并输入您的应用程序的捆绑 ID。如果您的应用程序尚未在 Apple Store 中,恐怕您需要将沙盒模式设置为 ON。一旦您的应用在 Apple Store 中发布,我认为您需要将沙盒模式设置为 OFF 并在 Facebook 配置中设置 Apple Store ID。
【讨论】:
【参考方案4】:即使我不能发表评论,所以把它写成答案。 我不确定,让我分析一下可能的原因 1)你说:“但它永远不会被调用!它不应该被调用吗?” -- 为
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
要被调用,在 info.plist 文件中,应正确设置 url 方案,即转到 URL 类型-->Item0-->URL 方案--->Item 0,此处的值应为 fbAPPID,即 fb 附加您实际的 facebookappID [FacebookAppID 也可能出现在 info.plist 中或硬编码在代码中]。
2) 你说: "sessionStateChanged 回调总是以 FBSessionStateClosedLoginFailed 结束"
在 sessionStateChanged 开关方法中检查 session 的状态,如果它创建或 createdTokenLoaded 然后尝试打开会话。
注意:[FBSession openActiveSessionWithPublishPermissions ....] 是一个静态方法,它会创建一个新的会话并设置为 FBSession.activeSession 其中 openWithCompletionHandler 是一个实例方法,只有在会话已经创建时才能工作。
case FBSessionStateCreated:
case FBSessionStateCreatedTokenLoaded:
[session openWithCompletionHandler:^(FBSession *session, FBSessionState status, NSError *error)
//handle the updating of views according to the sate of session
];
break;
【讨论】:
谢谢拉维!幸运的是,我被允许评论我自己的问题;)关于对 openURL 的调用,是的,我在 info.plist 中的 url 方案配置正确,我重新检查了它,并且在 3.0 sdk 下也没有遇到任何问题!我刚刚尝试按照您的建议将带有 openWithCompletionHandler 的 FBSessionStateCreated 和 FBSessionStateCreatedTokenLoaded 添加到 sessionStateChanged 中的 switch 语句中,不幸的是,唯一的值状态始终是 FBSessionStateClosedLoginFailed ,因此永远不会调用 openWithCompletionHandler 块:( openURL 总是被正常调用吗?以及为什么相同的代码在 ios6 模拟器上运行良好的任何提示(为此,我在设置中使用相同的 facebook 帐户配置了 facebook 框架)? 当其他应用程序尝试使用 url 方案调用您的应用程序时,始终会调用 OpenURL(fbappid://... in info.plist ,您的应用程序正在向 iOS 注册方案)。我猜是模拟器没有本机应用程序并使用 safari 或 web 视图进行身份验证。这可能是黑白设备和模拟器行为不同的原因。另请注意,您在将会话发送到后台时并未关闭会话。 我不确定原因,但我在 SO 上读到 openActiveSession 正在产生问题(由于设置活动会话时的顺序),因此人们创建了自己的会话并将其设置为活动会话和然后调用 openWithCompletionHandler 。 ios6 的模拟器确实具有与设备上相同的配置方式的本机框架,并且如果配置了 safari 登录,则不使用它,这就是为什么它让我如此困惑以至于它在那里工作但不是在真机!关于后台处理我只处理 [FBSession.activeSession handleDidBecomeActive];在 applicationDidBecomeActive 和 [FBSession.activeSession close] 中;在 applicationWillTerminate 作为 facebook 文档。【参考方案5】:我同意 JohnG 的观点,但需要额外注意的是:
请注意,如果handleOpenURL:
中有多个案例,您可以过滤:
if ([sourceApplication isEqualToString:@"com.facebook.facebook"] ||
[sourceApplication isEqualToString:@"com.facebook.Facebook"])
//Do Stuff
这很奇怪,但我能够在多个设备上复制 sourceApplication
以“Facebook”和“facebook”的形式返回。
【讨论】:
[[sourceApplication lowercaseString] isEqualToString:@"com.facebook.facebook"] 将完成这项工作【参考方案6】:在 FB SDK 3.5 上,您可以使用以下命令终止令牌:
[[FBSessionTokenCachingStrategy defaultInstance] clearToken];
【讨论】:
你可以登录到你的 facebook 开发者帐户,然后在这个页面上杀死你的令牌...对测试非常有用:[link]developers.facebook.com/tools/explorerGraph API Explorer以上是关于ios6 facebook集成登录始终 FBSessionStateClosedLoginFailed 从不打开的主要内容,如果未能解决你的问题,请参考以下文章
facebook-ios-sdk 是不是使用 iOS 6 Facebook 集成来支持登录而不打开本机 Facebook 应用程序?
如何在 iPhone 上从 Facebook 注销(本机/集成)