在iOS 9中,本地Facebook应用程序无法通过Facebook登录打开

Bhu*_*tre 52 facebook objective-c ios facebook-login ios9

我已经将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"
Run Code Online (Sandbox Code Playgroud)

我正在使用以下方法来执行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];
     }
Run Code Online (Sandbox Code Playgroud)

我在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>
Run Code Online (Sandbox Code Playgroud)

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

swi*_*Boy 54

以下是新"Facebook登录"的完整流程.


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

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

步骤1.下载最新的Facebook SDK(包括重大更改).

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

步骤3.现在转到Project> Build Phases>添加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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

4.3添加URL方案

<key>LSApplicationQueriesSchemes</key>
  <array>
      <string>fbapi</string>
      <string>fb-messenger-api</string>
      <string>fbauth2</string>
      <string>fbshareextension</string>
  </array>
Run Code Online (Sandbox Code Playgroud)

步骤-5.现在打开AppDelegate.m文件

5.1添加以下import语句,(删除旧语句).

#import <FBSDKLoginKit/FBSDKLoginKit.h>
 #import <FBSDKCoreKit/FBSDKCoreKit.h>
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

步骤-6.现在我们需要修改Login Controller,我们在那里执行Login任务

6.1在Login ViewController.m中添加这些导入

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
Run Code Online (Sandbox Code Playgroud)

6.2添加Facebook登录按钮

FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.center = self.view.center;
[self.view addSubview:loginButton];
Run Code Online (Sandbox Code Playgroud)

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"];

                 }
             }
         }];
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
            }
         }];
    }
}
Run Code Online (Sandbox Code Playgroud)

步骤-7.现在你可以建立项目,你应该到屏幕下方.

在此输入图像描述

希望这会帮助你们.

参考文献:感谢Facebook文档,Stackoverflow帖子和谷歌.

  • 这非常有用,但是OP询问了启动应用程序的问题,这个答案没有说明该怎么做.在你的回答中,解释一下,使用最新的SDK不再可能. (18认同)

小智 33

这是设计的.Facebook仍然存在iOS9的一些问题.

请参阅Facebook团队回复:https://developers.facebook.com/bugs/786729821439894/? search_id 谢谢

  • @SimonCross这有点令人失望,因为许多人没有通过浏览器登录(但应用程序登录通常持续存在). (5认同)
  • @SimonCross我所有的朋友都不使用safari他们只使用Facebook应用程序连接到Facebook和那个逻辑..为什么作为开发人员我们应该强迫我们的用户通过safari连接..许多其他人使用chrome但是他们不关心safari是手机中的默认浏览器 (3认同)
  • @SimonCross这似乎是一些相当糟糕的研究.我非常怀疑绝大多数用户都是在Safari上登录的.而那些不是?他们真的记得他们的证件吗?我猜它不太可能. (2认同)

Mik*_*e.R 11

最后我将我的Podfile更改为以前的FB版本:
来自:

pod 'FBSDKCoreKit' pod 'FBSDKLoginKit' pod 'FBSDKShareKit'
至:

pod 'FBSDKCoreKit','~>4.5.1'
pod 'FBSDKLoginKit','~>4.5.1'
pod 'FBSDKShareKit','~>4.5.1'
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,Facebook应检查用户的最后一次登录,并根据它触发正确的登录流程.(并让小型开发人员远离"web vs native war").


小智 4

@丹是对的。为了在 iOS 9 上为用户提供最佳体验,新的 SDK 自动确定最佳登录流程。如果您运行的是 iOS 8 或更早版本,则应用程序切换仍将是首选。