原生Facebook应用程序无法在iOS 9中使用Facebooklogin进行打开

我已经更新iPhone 6加到iOS 9testing版,并尝试执行Facebooklogin,但每次提交UIWebView与Facebooklogin表单。

我有Facebook的SDK

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

我正在使用以下方法执行Facebooklogin

  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 device Setting-> Facebook credentials但从来没有打开Facebook应用程序login。 似乎它不承认Facebook应用程序安装在设备上。

以下是新的“Facebooklogin”的完整过程。


这是我如何修改我的Facebooklogin整合,以使其在最新的更新工作。

Xcode 7.xiOS 9Facebook SDK 4.x

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

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

步骤3。 现在转到Project> Build Phases>添加SafariServices.framework

步骤4。 我们需要validationinfo.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添加URLscheme

 <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。 现在我们需要修改我们的login控制器,在那里我们做login任务

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

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

6.2添加Facebookloginbutton

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

6.3处理loginbutton点击

 -(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。 现在你可以build立项目,你应该得到下面的屏幕。

在这里输入图像说明

希望这会帮助你们。

参考文献 :感谢Facebook的文档,Stackoverflow的post和谷歌。

这是devise。 Facebook仍然有一些iOS9的问题。

查看Facebook团队回复: https : //developers.facebook.com/bugs/786729821439894/? search_id谢谢

最后我把我的Podfile改成了以前的FB版本:
从:

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

 pod 'FBSDKCoreKit','~>4.5.1' pod 'FBSDKLoginKit','~>4.5.1' pod 'FBSDKShareKit','~>4.5.1' 

从我的angular度来看,Facebook应该检查用户的最后一次login,并以此为基础触发正确的loginstream程(并使小型开发人员摆脱“networking与本地战争”)。

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

Safari View Controller默认在Facebook SDK中。 对于那些想恢复到之前的体验的人来说,请看下面的内容。 它只适用于3.x SDK,这在4.x上不起作用。

如果您想使v3.x SDK(在v3.2.4.1上testing)像以前一样工作(无需打开Safari View Controller并使应用程序切换),可以在应用程序的开始位置调用此代码,例如didFinishLaunchingWithOptions:

 SEL useSafariSel = sel_getUid("useSafariViewControllerForDialogName:"); SEL useNativeSel = sel_getUid("useNativeDialogForDialogName:"); Class FBDialogConfigClass = NSClassFromString(@"FBDialogConfig"); Method useSafariMethod = class_getClassMethod(FBDialogConfigClass, useSafariSel); Method useNativeMethod = class_getClassMethod(FBDialogConfigClass, useNativeSel); IMP returnNO = imp_implementationWithBlock(^BOOL(id me, id dialogName) { return NO; }); method_setImplementation(useSafariMethod, returnNO); IMP returnYES = imp_implementationWithBlock(^BOOL(id me, id dialogName) { return YES; }); method_setImplementation(useNativeMethod, returnYES); 

它debuggingFBDialogConfig的两个方法。

不要忘记导入objc / runtime.h头文件:

 #import <objc/runtime.h> 

@SimonCross有些人只是不希望了解,Safari浏览器控制器提供了最好的用户体验 – 他们认为,或确切地知道,他们的用户没有在Safari中loginFacebook,但肯定login在Facebook应用程序。

在设置了本专栏中提到的所有必需的.plist键之后,我使用了以下解决scheme来解决login问题。

 var fbLoginManager : FBSDKLoginManager = FBSDKLoginManager() fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web 

所以它总是在应用程序中login。

随着iOS 9的发布,苹果推出了一些应用切换的重大改变。 这影响了与Facebook集成的iOS 9应用程序。 大多数人会在使用Facebooklogin时注意到这一点。 在使用最新的SDK(v4.6和v3.24)的应用程序中,我们将使用Safari视图控制器(SVC)而不是快速应用程序切换(FAS)来生成一个stream,因为其他对话插页式广告会添加额外的步骤在iOS 9的FAS上login过程。另外,我们从250多个应用程序中看到的数据表明,从长远来看这是最好的体验。 请阅读详情。 https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9

Facebook改变了iOS9的Facebooklogin行为。

这里是来自Facebook博客的引用:

自iOS 9发布以来,我们一直在监控过去6周内超过250个应用程序的数据和点击率。 SVClogin的点击率(CTR)优于应用程序切换login的点击率(CTR),提高了应用程序切换体验的3倍。 这表明SVC的经验对于今天的人们和开发者来说是更好的,从长远来看可能是最好的解决scheme。 出于这个原因,最新的Facebook SDK for iOS使用SVC作为Login的默认体验。

这对我有效。 将此添加到您的.plist

 <key>LSApplicationQueriesSchemes</key> <array> <string>fb</string> </array> 

对于iOS9,我们需要将密钥添加到URL列表的.plist中。

我知道这是旧的。 但是你可以把这个代码放到你的application:(UIApplication *)application didFinishLaunchingWithOptions:

 SEL useNativeSel = sel_getUid("useNativeDialogForDialogName:"); Class FBSDKServerConfiguration = NSClassFromString(@"FBSDKServerConfiguration"); Method useNativeMethod = class_getInstanceMethod(FBSDKServerConfiguration, useNativeSel); IMP returnYES = imp_implementationWithBlock(^BOOL(id me, id dialogName) { return YES; }); method_setImplementation(useNativeMethod, returnYES); 

当安装应用程序而不是浏览器时, FacebookSDK将通过本地应用程序login。

把这个在appdelegate解决了我的问题

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, annotation: options[UIApplicationOpenURLOptionsKey.annotation]) } 

将下面的行添加到.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>fbauth</string> <string>fbauth2</string> <string>fb-messenger-api20140430</string> </array>