ios - Facebook native 登录不会打开 facebook 应用程序,即使它已安装在设备中?

标签 ios objective-c facebook-ios-sdk

我已经按照适用于 iOS 9 的 facebook-iso-sdk 4.8.0 文档中描述的每个步骤进行操作,但仍然无法在我的应用程序中对“login-with-facebook”执行应用程序切换,即使 facebook 应用程序是已经安装。

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

我还仔细检查了 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];
                     }
                 }];
            }
        }
    }];

我错过了什么?

Screen Shot of info.plist

最佳答案

我找到了解决方案,但您应该在 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;
        };
    };

默认情况下 use_native_flow 为 0,因此当它在 userDefaults 中保存信息以供下次应用启动时使用。 因此,当应用程序调用 FBSDKLoginMananger 登录方法并检查此方法中的 loginBehaviour 时,变量 useNativeDialog 返回 NO。所以开关使用下一个案例。 案例 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: {
    .
    . 
    . 

}

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

BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];

 BOOL useNativeDialog = YES;

我知道这不是一个好的做法,如果我更新这个 Pod,它会改变,但至少在工作,我现在需要它。 我想我们可以在 facebook 开发人员管理站点中更改该配置,但我还没有找到任何东西。

关于ios - Facebook native 登录不会打开 facebook 应用程序,即使它已安装在设备中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33971727/

相关文章:

ios - 使用 AVPlayerViewController 的前置视频广告

ios - Swift:IBOutlet var UITableView 的延迟实例化

ios - 隐藏导航栏的问题

ios - 如何在单元格中显示图像?

objective-c - 在 obj-c 中创建非 self 委托(delegate)

ios - iOS 8 中的 Facebook SDK 与 Swift/Xcode beta 5 返回 accessToken 但更新后没有 userID

ios - 从 iOS 照片库 uri 获取 base64 照片

ios - 从 URL webView 调用 Objective C 方法

ios - Facebook iOS 3.1 SDK : can login with Safari but not natively

ios - 带有自定义表格单元格的 FB Friend Picker View Controller