更新:某种行为似乎已经发生了变化。我不再收到错误消息,但本机登录仍然无法正常工作。相反,如果未安装Facebook应用程序,我将被重定向到Web对话框。 Facebook是否删除了最后一个SDK的本机登录支持? 我请求的权限是“public_profile”,“email”和“user_likes”。我还尝试删除“user_likes”权限,因为它不是此处所述的基本权限的一部分:https://developers.facebook.com/docs/ios/ui-controls#iosintegration 仍然没有出现本机登录对话框!
我最近更新了我的iOS项目以使用Facebook SDK版本3.14.0(通过CocoaPods从3.13.0升级)。我阅读了升级说明,并按照建议将“basic_info”权限更改为“public_profile”。
如果我现在打电话
FBSession openActiveSessionWithReadPermissions:
allowLoginUI:
completionHandler:
它只能通过网络或Facebook App登录。如果我在操作系统设置中本机登录,则登录失败并显示
Error Domain=com.facebook.sdk Code=2 "The operation couldn’t be completed. (com.facebook.sdk error 2.)"
有没有人遇到过类似的问题?本机登录不再以这种方式工作吗?或者“更改”权限是否有问题?
此致 ķ
答案 0 :(得分:56)
我也讨论了这个问题,这里有关于发生了什么的详细信息&我如何修复我的应用程序。
底线
由于新的登录过程,用户现在可以批准/拒绝每个请求的权限(本地ios集成登录不支持的内容),Facebook已经改变了sdk的默认登录行为,首先尝试Facebook快速应用程序切换&然后回到网络视图,完全忽略任何ios系统级别的Facebook凭据。
这在升级指南(表格3.13> 3.14)中注明:https://developers.facebook.com/docs/ios/upgrading
相关部分:
"默认登录行为已从FBSessionLoginBehaviorUseSystemAccountIfPresent更改为FBSessionLoginBehaviorWithFallbackToWebView。"
那该怎么办?
好吧,如果你不需要任何新东西,FBLikeControl等......,在3.14中引入,你可以降级到3.13。但是,如果您希望/需要使用3.14n,那么FBSession上的实例方法将FBSessionLoginBehavior作为参数:https://developers.facebook.com/docs/reference/ios/current/class/FBSession/#openWithBehavior:completionHandler:
我更新了我的方法主体,用于打开Facebook会话:
[FBSession openActiveSessionWithReadPermissions:@[@"email", @"user_location"] allowLoginUI:YES completionHandler: ^(FBSession *session, FBSessionState state, NSError *error) { [self sessionStateChanged:session state:state error:error]; } ];
为:
FBSessionStateHandler completionHandler = ^(FBSession *session, FBSessionState status, NSError *error) { [self sessionStateChanged:session state:status error:error]; }; if ([FBSession activeSession].state == FBSessionStateCreatedTokenLoaded) { // we have a cached token, so open the session [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:completionHandler]; } else { [self clearAllUserInfo]; // create a new facebook session FBSession *fbSession = [[FBSession alloc] initWithPermissions:@[@"email", @"user_location"]]; [FBSession setActiveSession:fbSession]; [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent completionHandler:completionHandler]; }
注意:我的clearAllUserInfo方法包含以下几行:
[FBSession.activeSession closeAndClearTokenInformation]; [FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) { NSLog(@"%@", error); }]; [FBSession setActiveSession:nil];
还值得查看关于理解会话的Facebook文档:http://developers.facebook.com/docs/facebook-login/ios/v2.0#sessions
答案 1 :(得分:3)
检查您要求的权限,在新的SDK(3.14)中,不推荐使用basic_info权限,您需要提交应用以供查看扩展权限。基本权限是:public_profile,email和user_friends
答案 2 :(得分:0)
也许你可能会错过这种方法:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [FBSession.activeSession handleOpenURL:url];
}
这有助于我的案例,我必须从3.9.0迁移到最新版本。希望它有所帮助。
答案 3 :(得分:0)
我也遇到过这个问题。一个快速的解决方法就是让用户删除他们的iOS Facebook凭据,使用您的应用登录,然后重新输入他们的凭据。
答案 4 :(得分:0)
如果您使用Facebook SDK 4.0,则可以设置登录行为。默认值为FBSDKLoginBehaviorNative
,但您可以将其设置为FBSDKLoginBehaviorSystemAccount
。
见下面的代码:
FBSDKLoginManager *loginManager = [[FBSDKLoginManager alloc] init];
login.loginBehavior = FBSDKLoginBehaviorSystemAccount;
[loginManager logInWithReadPermissions:@[@"email"]
fromViewController:self
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
//TODO: process error or result
}];