La aplicación nativa de Facebook no se abre con el inicio de sesión de Facebook en iOS 9

He actualizado iPhone 6 plus a iOS 9 beta e bash realizar un inicio de sesión en Facebook, pero cada vez que presento UIWebView con el formulario de inicio de sesión de Facebook.

Tengo Facebook SDK

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

Y estoy usando los siguientes métodos para realizar Facebook Login

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

Tengo la siguiente configuración bajo el archivo plist

  LSApplicationQueriesSchemes  fbapi fbapi20130214 fbapi20130410 fbapi20130702 fbapi20131010 fbapi20131219 fbapi20140410 fbapi20140116 fbapi20150313 fbapi20150629 fb-messenger-api20140430 fbauth fbauth2  

Por favor, hágame saber lo que me falta aquí. Primero está comprobando la iPhone device Setting-> Facebook credentials pero nunca abra la aplicación de Facebook para iniciar sesión. Parece que no reconoce la aplicación de Facebook instalada en el dispositivo.

A continuación se muestra el proceso completo para el nuevo “inicio de sesión de Facebook”.


así es como he revisado mi integración de inicio de sesión de Facebook para que funcione en la última actualización.

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

Paso 1. Descargue el último SDK de Facebook (incluye cambios importantes).

Paso 2. Agregue FBSDKCoreKit.framework y FBSDKLoginKit.framework a su proyecto.

Paso 3. Ahora ve a Project> Build Phases> add SafariServices.framework

Etapa 4. Hay tres cambios en info.plist que debemos verificar.

4.1 Asegúrese de tener abajo en su archivo info.plist

 CFBundleURLTypes   CFBundleURLSchemes      FacebookAppID  FacebookDisplayName  

4.2 Ahora agregue a continuación para los servidores de Facebook de lista blanca, esto es imprescindible para iOS 9

 NSAppTransportSecurity  NSExceptionDomains  facebook.com  NSIncludesSubdomains  NSExceptionRequiresForwardSecrecy   fbcdn.net  NSIncludesSubdomains  NSExceptionRequiresForwardSecrecy   akamaihd.net  NSIncludesSubdomains  NSExceptionRequiresForwardSecrecy     

4.3 Agregar esquemas de URL

 LSApplicationQueriesSchemes  fbapi fb-messenger-api fbauth2 fbshareextension  

Paso-5. Ahora abra el archivo AppDelegate.m

5.1 Añada declaraciones de importación a continuación, (elimine la anterior).

 #import  #import  

5.2 actualización siguiendo los siguientes métodos

 - (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]; } 

Paso-6. Ahora tenemos que modificar nuestro controlador de inicio de sesión, donde hacemos la tarea de inicio de sesión

6.1 Agregue estas importaciones en Login ViewController.m

 #import  #import  

6.2 Agregar el botón de inicio de sesión de Facebook

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

6.3 Botón de acceso a la manija Haga clic en

 -(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 Obtener información del usuario (nombre, correo electrónico, etc.)

 -(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); } }]; } } 

Paso-7. Ahora puedes construir un proyecto, debes obtener la pantalla debajo.

enter image description here

Espero que esto los ayude chicos.

Referencias : gracias a los documentos de Facebook, las publicaciones de Stackoverflow y Google.

Esto es por diseño. Facebook todavía tiene algún problema con iOS9.

Consulte la respuesta del equipo de Facebook: https://developers.facebook.com/bugs/786729821439894/?search_id Gracias

Al final, cambié mi Podfile a la versión anterior de FB:
De:

pod 'FBSDKCoreKit' pod 'FBSDKLoginKit' pod 'FBSDKShareKit'
A:

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

Desde mi punto de vista, Facebook debería verificar el último inicio de sesión del usuario y, en función de ello, activar el flujo de inicio de sesión correcto (y mantener a los pequeños desarrolladores fuera de “guerra web vs guerra nativa”).

@dan tiene razón. Con el fin de proporcionar la mejor experiencia para los usuarios en iOS 9, el nuevo SDK determina el mejor flujo de inicio de sesión automáticamente. Si está ejecutando en iOS 8 o anterior, el cambio de aplicación seguirá siendo preferido.

Safari View Controller se encuentra de forma predeterminada en el SDK de Facebook. Para aquellos de ustedes que quieran volver a la experiencia previa, mire abajo. Funciona solo para 3.x SDK, esto no funcionará en 4.x.

Si desea hacer que el v3.x SDK (probado en v3.24.1) funcione como antes (sin abrir Safari View Controller y hacer que la aplicación cambie) llame a este código al inicio de la aplicación, por ej. 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); 

Swizzles dos métodos de FBDialogConfig.

No olvide importar el encabezado objc / runtime.h:

 #import  

@SimonCross algunas personas simplemente no quieren entender que Safari View Controller brinda la mejor experiencia de usuario: piensan, o saben con certeza, que sus usuarios no han iniciado sesión en Facebook en Safari, pero que están seguros de que iniciaron sesión en la aplicación de Facebook .

Después de configurar todas las claves .plist necesarias como se menciona en esta columna, utilicé la siguiente solución para salir del problema de inicio de sesión.

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

Para que siempre inicie sesión en la aplicación.

Con el lanzamiento de iOS 9, Apple introdujo algunos cambios significativos en el cambio de aplicaciones. Esto ha afectado a las aplicaciones iOS 9 integradas con Facebook. La mayoría de las personas lo notará en su experiencia al usar Facebook Login. En las aplicaciones que usan el último SDK (v4.6 y v3.24), vamos a crear un flujo con Safari View Controller (SVC) en lugar de Fast-App-Switching (FAS) debido a los intersticiales de diálogo adicionales que agregan pasos adicionales al proceso de inicio de sesión en FAS en iOS 9. Además, los datos que hemos visto de más de 250 aplicaciones indican que esta es la mejor experiencia para las personas a largo plazo. Por favor, siga leyendo para más detalles. https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9

Facebook ha cambiado el comportamiento de inicio de sesión de Facebook para iOS9.

Aquí está la cita de la publicación de blog de Facebook :

Hemos estado monitoreando datos y CTR en más de 250 aplicaciones en las últimas 6 semanas desde el lanzamiento de iOS 9. La tasa de clics (CTR) del inicio de sesión de SVC supera el CTR del inicio de sesión con el cambio de aplicación y está mejorando a 3 veces la velocidad de la experiencia de cambio de aplicación. Esto indica que la experiencia SVC es mejor para las personas y los desarrolladores de hoy, y probablemente sea la mejor solución a largo plazo. Por este motivo, el último SDK de Facebook para iOS utiliza SVC como experiencia predeterminada para el inicio de sesión.

Esto funcionó para mí. Agregue esto a su .plist .

 LSApplicationQueriesSchemes  fb  

Para iOS9, necesitamos agregar la clave a nuestro .plist para Esquemas de URL.

Sé que es viejo. Pero puede poner este código en su 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); 

Y FacebookSDK iniciará sesión a través de la aplicación nativa cuando la aplicación esté instalada en lugar del navegador.

Al poner esto en appdelegate, resolví mi problema

 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]) } 

Agregar líneas a continuación al archivo .plist me ayudó:

 LSApplicationQueriesSchemes  fbapi fbapi20130214 fbapi20130410 fbapi20130702 fbapi20131010 fbapi20131219 fbapi20140410 fbapi20140116 fbapi20150313 fbapi20150629 fbauth fbauth2 fb-messenger-api20140430