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

He actualizado el iPhone 6 plus a iOS 9 beta y trato de realizar el inicio de session en Facebook, pero cada vez que presenta UIWebView con el formulario de inicio de session de Facebook.

Tengo SDK de Facebook

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

Y estoy usando los siguientes methods para realizar un inicio de session en 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 shanetworkingURLCache] removeAllCachedResponses]; // create a new facebook session FBSession *fbSession = [[FBSession alloc] initWithPermissions:permissions]; [FBSession setActiveSession:fbSession]; [fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent fromViewController:nil completionHandler:completionHandler]; } 

Tengo la configuration siguiente en file de 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> 

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

A continuación se muestra el process completo para el nuevo "inicio de session en Facebook".


así es como he revisado mi integración de inicio de session en Facebook para que funcione con 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 necesitamos verificar.

4.1 Asegúrese de tener a continuación en su file 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 Ahora agregue a continuación los serveres de Facebook de list blanca, esto debe ser para 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 Agregar esquemas de URL

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

Paso 5 Ahora abre el file AppDelegate.m

5.1 Agregue las siguientes declaraciones de import, (elimine una antigua).

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

5.2 actualización siguiendo los siguientes methods

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[FBSDKApplicationDelegate shanetworkingInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; } - (void)applicationDidBecomeActive:(UIApplication *)application { [FBSDKAppEvents activateApp]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return [[FBSDKApplicationDelegate shanetworkingInstance] application:application didFinishLaunchingWithOptions:launchOptions]; } 

Paso 6 Ahora tenemos que modificar nuestro controller de inicio de session, donde hacemos la tarea de inicio de session

6.1 Agregue estas importaciones en Login ViewController.m

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

6.2 Agregar button de inicio de session de Facebook

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

6.3 Haga clic en el button de inicio de session

 -(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 Obtenga información de 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 puede build un proyecto, debería aparecer debajo de la pantalla.

introduzca la descripción de la imagen aquí

Espero que esto los ayude a ustedes.

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

Esto es por layout. Facebook todavía tiene algún problema con iOS9.

Mira 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 debe verificar el último inicio de session del usuario y, en function de ello, desencadenar el flujo de inicio de session correcto (y mantener a los pequeños desarrolladores fuera de "web vs guerra nativa").

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

Safari View Controller está de manera pnetworkingeterminada en el SDK de Facebook. Para aquellos de ustedes que desean volver a la experiencia previa, vea a continuación. Funciona solo para 3.x SDK, esto no funcionará en 4.x.

Si desea hacer que el SDK v3.x (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 en algún lugar al comienzo de la aplicación, por ejemplo, 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 methods de FBDialogConfig.

No olvide importar el encabezado objc / runtime.h:

 #import <objc/runtime.h> 

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

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

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

Para que siempre se inicie session 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 notarán esto en su experiencia usando el inicio de session de Facebook. En las aplicaciones que usan el SDK más reciente (v4.6 y v3.24), emergeremos un flujo usando Safari View Controller (SVC) en lugar de la aplicación rápida (FAS) debido a los intersticiales de dialog adicionales que agregan pasos adicionales al process de inicio de session en FAS en iOS 9. Además, los datos que hemos visto en más de 250 aplicaciones indican que esta es la mejor experiencia para las personas a largo ploop. Por favor, lea para más detalles. https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9

Facebook ha cambiado el comportamiento de inicio de session de Facebook para iOS9.

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

Hemos estado monitoreando datos y CTR para más de 250 aplicaciones en las últimas 6 semanas desde el lanzamiento de iOS 9. La tasa de clics (CTR) de SVC Login supera el CTR del inicio de session de app-switch y está mejorando a 3 veces la tasa de la experiencia de cambio de aplicación. Esto indica que la experiencia de SVC es mejor para las personas y los desarrolladores de hoy, y es probable que sea la mejor solución a largo ploop. Por esta razón, el último SDK de Facebook para iOS utiliza SVC como la experiencia pnetworkingeterminada para Iniciar session.

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

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

Para iOS9, necesitamos agregar la key a nuestro .plist para los 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á session a través de la aplicación nativa cuando la aplicación esté instalada en lugar del browser.

Poner esto en appdelegate resolvió mi problema

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

Agregar líneas debajo al file .plist me ayudó:

 <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>