Facebook原生登录即使安装在设备中也不会打开Facebook应用程序?

Paw*_*shi 6 objective-c ios facebook-ios-sdk

我已经按照facebook-iso-sdk 4.8.0 for iOS 9的文档中描述的每个步骤进行了操作,但仍然无法在我的应用程序中使用"login-with-facebook"进行应用程序切换,即使已经安装了facebook app.

正如您在下面的屏幕截图中看到的,我已经修改了info.plist,但仍然无法让本机应用程序切换工作.

我还检查了info.plist值中的错字错误.我可以向你保证他们是对的.

这是我的代码: -

    if (![AppDelegate SharedInstance].login) {
        [AppDelegate SharedInstance].login = [[FBSDKLoginManager alloc] init];
    }
    [AppDelegate SharedInstance].login.loginBehavior = FBSDKLoginBehaviorNative;
    [[AppDelegate SharedInstance].login logInWithReadPermissions:@[@"public_profile",@"email",@"user_friends"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
        if (error) {

        }
        else if (result.isCancelled)
        {
            // Handle cancellations
        }
        else
        {
            NSLog(@"result.grantedPermissions == %@",result.grantedPermissions);
            if (result.token)
            {
                [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email, first_name, last_name"}]
                 startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
                     if (!error) {
                         NSLog(@"fetched user:%@", result);
                         NSString *userImageURL = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", [result objectForKey:@"id"]];
                         [dictFacebookDetail addEntriesFromDictionary:result];
                         [dictFacebookDetail setObject:userImageURL forKey:@"profilepic"];
                         NSLog(@"facebook login result --- %@",dictFacebookDetail);
                         [self performSelectorInBackground:@selector(CheckFacebookUser:) withObject:dictFacebookDetail];
                     }
                 }];
            }
        }
    }];
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

info.plist的屏幕截图

cro*_*dor 9

我找到了解决方案,但您应该在FBSDKLogin pod中进行更改.我正在调试Pod,我意识到Facebook会在课堂上询问FBSDKServerConfiguration应用程序的服务器配置.它返回一个带有一些信息的JSON,以便为我们的应用程序配置Pod.我意识到默认情况下JSON返回这个字典:

 "ios_sdk_dialog_flows" =     {
        default =         {
            "use_native_flow" = 0;
            "use_safari_vc" = 1;
        };
        message =         {
            "use_native_flow" = 1;
        };
    };
Run Code Online (Sandbox Code Playgroud)

默认情况下,该use_native_flow值为0,因此在保存userDefaults下一个应用程序启动时的信息时.因此,当应用程序调用FBSDKLoginManangerlogin方法并在此方法中检查loginBehaviour时,该变量useNativeDialog返回NO.所以交换机使用下一个案例.case FBSDKLoginBehaviorBrowser:

- (void)logInWithBehavior:(FBSDKLoginBehavior)loginBehavior
{
.
.
...
  switch (loginBehavior) {
    case FBSDKLoginBehaviorNative: {
      if ([FBSDKInternalUtility isFacebookAppInstalled]) {
        [FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *loadError) {
            BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
          if (useNativeDialog && loadError == nil) {
            [self performNativeLogInWithParameters:loginParams handler:^(BOOL openedURL, NSError *openedURLError) {
              if (openedURLError) {
                [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors
                                   formatString:@"FBSDKLoginBehaviorNative failed : %@\nTrying FBSDKLoginBehaviorBrowser", openedURLError];
              }
              if (openedURL) {
                completion(YES, FBSDKLoginManagerLoggerAuthMethod_Native, openedURLError);
              } else {
                [self logInWithBehavior:FBSDKLoginBehaviorBrowser];
              }
            }];
          } else {
            [self logInWithBehavior:FBSDKLoginBehaviorBrowser];
          }
        }];
        break;
      }
      // intentional fall through.
    }
    case FBSDKLoginBehaviorBrowser: {
    .
    . 
    . 

}
Run Code Online (Sandbox Code Playgroud)

正如我们在代码中看到的那样,我们知道应用程序是否安装在此代码中 if ([FBSDKInternalUtility isFacebookAppInstalled]).为了解决这个问题,我改变了这一行

BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
Run Code Online (Sandbox Code Playgroud)

 BOOL useNativeDialog = YES;
Run Code Online (Sandbox Code Playgroud)

我知道这不是一个好习惯,如果我更新这个Pod,它会改变,但至少是工作,我现在需要它.我想我们可以在facebook开发者管理网站上更改该配置,但我还没有找到任何内容.

  • 伙计......你是救世主.感谢你的努力.我真的这么做.你救了我很多麻烦 (2认同)

小智 8

Facebook改变了iOS9的Facebook登录行为.

以下是Facebook博客文章的引用:

自iOS 9推出以来,我们一直在监控超过250个应用程序的数据和点击率.SVC登录的点击率(CTR)优于app-switch登录的点击率,并且以app-switch体验的3倍速度提升.这表明SVC体验对于今天的人和开发人员来说更好,并且从长远来看可能是最好的解决方案.因此,最新的iOS SDK SDK使用SVC作为Login的默认体验.