ios - 在 iOS 9 中, native Facebook 应用无法通过 Facebook 登录打开

标签 ios objective-c facebook ios9 facebook-login

我已将 iPhone 6 plus 更新到 iOS 9 测试版并尝试执行 Facebook 登录,但每次都使用 Facebook 登录表单呈现 UIWebView。

我有 Facebook sdk

FB_IOS_SDK_VERSION_STRING @"3.24.0"
FB_IOS_SDK_TARGET_PLATFORM_VERSION @"v2.2"

我正在使用以下方法来执行 Facebook 登录

    NSArray *permissions = @[@"email",@"user_birthday",@"public_profile"];


     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
                                 fromViewController:nil
                                  completionHandler:completionHandler];
     } else {

     [self clearAllUserInfo];
    [[NSURLCache sharedURLCache] removeAllCachedResponses];

     // create a new facebook session
     FBSession *fbSession = [[FBSession alloc] initWithPermissions:permissions];
     [FBSession setActiveSession:fbSession];
     [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
              fromViewController:nil
               completionHandler:completionHandler];
     }

我在 plist 文件下有以下设置

    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fbapi</string>
        <string>fbapi20130214</string>
        <string>fbapi20130410</string>
        <string>fbapi20130702</string>
        <string>fbapi20131010</string>
        <string>fbapi20131219</string>
        <string>fbapi20140410</string>
        <string>fbapi20140116</string>
        <string>fbapi20150313</string>
        <string>fbapi20150629</string>
        <string>fb-messenger-api20140430</string>
        <string>fbauth</string>
        <string>fbauth2</string>
   <array>

请让我知道我在这里缺少什么。首先它正在检查 iPhone 设备设置-> Facebook 凭据,但从不打开 Facebook 应用程序进行登录。似乎它无法识别设备上安装的 Facebook 应用。

最佳答案

以下是新“Facebook 登录”的完整流程。


这就是我修改 Facebook 登录集成以使其在最新更新上工作的方式。

Xcode 7.x , iOS 9 , Facebook SDK 4.x

步骤 1。下载最新的 Facebook SDK(其中包含重大更改)。

第 2 步。将 FBSDKCoreKit.frameworkFBSDKLoginKit.framework 添加到您的项目中。

第 3 步。现在转到项目 > 构建阶段 > 添加 SafariServices.framework

第 4 步。 info.plist 中有三个变化我们需要验证。

4.1 确保您的 info.plist 文件中有以下内容

<key>CFBundleURLTypes</key>
<array>
  <dict>
  <key>CFBundleURLSchemes</key>
  <array>
    <string><your fb id here eg. fbxxxxxx></string>
  </array>
  </dict>
</array>
  <key>FacebookAppID</key>
  <string><your FacebookAppID></string>
  <key>FacebookDisplayName</key>
<string><Your_App_Name_Here></string>

4.2 现在添加下面的白名单 Facebook 服务器,这是 iOS 9 必须的

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>facebook.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
    <key>fbcdn.net</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
    <key>akamaihd.net</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

4.3 添加 URL 方案

<key>LSApplicationQueriesSchemes</key>
  <array>
      <string>fbapi</string>
      <string>fb-messenger-api</string>
      <string>fbauth2</string>
      <string>fbshareextension</string>
  </array>

第 5 步。现在打开 AppDelegate.m 文件

5.1 添加下面的导入语句,(删除旧的)。

#import <FBSDKLoginKit/FBSDKLoginKit.h>
 #import <FBSDKCoreKit/FBSDKCoreKit.h>

5.2 更新如下方法

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                         openURL:url
                                               sourceApplication:sourceApplication
                                                      annotation:annotation];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
  [FBSDKAppEvents activateApp];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
                                    didFinishLaunchingWithOptions:launchOptions];
}

第 6 步。现在我们需要修改我们的登录 Controller ,我们在其中执行登录任务

6.1 在 Login ViewController.m

中添加这些导入
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>

6.2 添加 Facebook 登录按钮

FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.center = self.view.center;
[self.view addSubview:loginButton];

6.3 处理登录按钮点击

-(IBAction)facebookLogin:(id)sender
{
    FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];

    if ([FBSDKAccessToken currentAccessToken])
    {
        NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
        [self fetchUserInfo];
    }
    else
    {
        [login logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
         {
             if (error)
             {
                 NSLog(@"Login process error");
             }
             else if (result.isCancelled)
             {
                 NSLog(@"User cancelled login");
             }
             else
             {
                 NSLog(@"Login Success");

                 if ([result.grantedPermissions containsObject:@"email"])
                 {
                     NSLog(@"result is:%@",result);
                     [self fetchUserInfo];
                 }
                 else
                 {
                     [SVProgressHUD showErrorWithStatus:@"Facebook email permission error"];

                 }
             }
         }];
    }
}

6.4 获取用户信息(姓名、电子邮件等)

-(void)fetchUserInfo
{
    if ([FBSDKAccessToken currentAccessToken])
    {
        NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);

        [[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email"}]
         startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
             if (!error)
             {
                 NSLog(@"results:%@",result);

                 NSString *email = [result objectForKey:@"email"];
                 NSString *userId = [result objectForKey:@"id"];

                 if (email.length >0 )
                 {
                     //Start you app Todo
                 }
                 else
                 {
                    NSLog(@“Facebook email is not verified");
                 }
             }
             else
             {
                 NSLog(@"Error %@",error);
            }
         }];
    }
}

第 7 步。现在您可以构建项目了,您应该会看到下面的屏幕。

enter image description here

希望这对你们有帮助。

引用文献:感谢 Facebook 文档、Stackoverflow 帖子和 Google。

关于ios - 在 iOS 9 中, native Facebook 应用无法通过 Facebook 登录打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32566734/

相关文章:

objective-c - 仅当行被滑动时才从 UITableView 中删除删除按钮

ios - 以 10 为基数的 NSData

facebook - 是否有 Facebook API 来检索最近的音乐事件,尤其是 Spotify 上的音乐?

facebook - 删除 facebook HipHop (hhvm) Ubuntu 并调试它

objective-c - 设置 AVPlayerLayer VideoGravity 适用于模拟器,不适用于 iPad

ios - 如何使用 AVPlayer 播放 Apple Music 文件(甚至是 "available offline"文件)?

ios - 如何使用 Swift 从 Objective-C 启动实例类型

python - 将 Facebook Ads Insights 结果导入 pandas 数据框

iphone - NSDictionary 与自定义对象

iphone - 尝试取消本地通知时应用程序抛出 'NSInvalidArgumentException'