SDK更新至3.14后,原生Facebooklogin停止工作

更新 :不知何故,行为似乎已经改变。 我不再收到错误消息,但本地login仍然无效。 相反,如果未安装Facebook应用,我将redirect到Web对话框。 Facebook是否删除了最后一个SDK的本地login支持? 我请求的权限是“public_profile”,“email”和“user_likes”。 我也尝试删除“user_likes”权限,因为它不是这里所述的基本权限的一部分: https : //developers.facebook.com/docs/ios/ui-controls#iosintegration仍然没有出现本地login对话框!

我最近更新我的iOS项目使用Facebook SDK版本3.14.0(通过CocoaPods从3.13.0升级)。 我阅读升级说明,并按照build议将“basic_info”权限更改为“public_profile”。

如果我现在打电话

FBSession openActiveSessionWithReadPermissions: allowLoginUI: completionHandler: 

它只能通过networking或Facebook应用login。 如果我在操作系统设置中本地login,则login失败

 Error Domain=com.facebook.sdk Code=2 "The operation couldn't be completed. (com.facebook.sdk error 2.)" 

有没有人遇到类似的问题? 本地login不再以这种方式工作吗? 或者是“更改”权限的问题?

问候K

我也跑到这个问题上,这里是关于发生了什么以及我如何修复我的应用程序的细节。

底线
由于新的login过程,其中用户现在可以批准/拒绝每个请求的权限(本地ios集成login不支持的东西),Facebook已经改变了sdk的默认login行为,首先尝试Facebook快速应用程序切换,然后回落网页视图,完全忽略任何ios系统级别的Facebook凭据。

这在升级指南(表单3.13> 3.14)中注明: https : //developers.facebook.com/docs/ios/upgrading

相关部分:
“默认login行为已从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 *会议,FBSessionState状态,NSError *错误){
                                               [self sessionStateChanged:会话状态:状态错误:错误];
                                           }
     ]。

至:

     FBSessionStateHandler completionHandler = ^(FBSession *会话,FBSessionState状态,NSError *错误){
         [self sessionStateChanged:会话状态:状态错误:错误];
     };

     if([FBSession activeSession] .state == FBSessionStateCreatedTokenLoaded){
         //我们有一个caching的令牌,所以打开会话
         [[FBSession activeSession] openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                   completionHandler:completionHandler];
     } else {
         [self clearAllUserInfo];
         //创build一个新的Facebook会话
         FBSession * fbSession = [[FBSession alloc] initWithPermissions:@ [@“email”,@“user_location”]];
         [FBSession setActiveSession:fbSession];
         [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
                   completionHandler:completionHandler];
     }

注意:我的clearAllUserInfo方法包括以下几行:

     [FBSession.activeSession closeAndClearTokenInformation];
     [FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult结果,NSError *错误){
         NSLog(@“%@”,错误);
     }];
     [FBSession setActiveSession:nil];

理解会话的Facebook文档也是值得的: http : //developers.facebook.com/docs/facebook-login/ios/v2.0#sessions

检查您要求的权限,在新的SDK(3.14)中,basic_info权限已被弃用,您需要提交应用程序以进行扩展权限审查。 基本权限是:public_profile,email和user_friends

更多信息在这里: https : //developers.facebook.com/docs/ios/upgrading

也许你可能会错过这个方法:

 - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [FBSession.activeSession handleOpenURL:url]; } 

它帮助我必须从3.9.0迁移到最新的情况。 希望能帮助到你。

我也遇到了这个问题。 一个快速的解决方法是让用户删除他们的iOS Facebook的凭据,login你的应用程序,然后把他们的凭据回来。

如果您使用Facebook SDK 4.0,则可以设置login行为。 默认值是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 }];