"Ya ha autorizado su aplicación" al iniciar session con FBSDK 4.7.1

Estaba siguiendo el propio tutorial de Facebook para el inicio de session de FB en iOS (Objective-C), pero cada vez que inicie session -después de la pantalla de autorización de permiso inicial- obtuve la famosa vista web "Ya has autorizado esta aplicación".

He leído un montón de publicaciones, pero no he podido resolverlo, de ahí la (re) publicación. Encuentro esto bastante extraño porque la aplicación no tiene absolutamente nada, excepto el código de inicio de session de Boilerplate. Este comportamiento ocurre tanto en el simulador como en los dispositivos reales.

Parece que no puede sacudir esta vista web fuera del camino.

Esta aplicación es para iOS 9.0 y estoy usando FBSDK 4.7.1 (instalado a través de CocoaPods):

pod 'FBSDKLoginKit', '~> 4.6' 

El código en sí mismo es bastante repetitivo, aquí está mi AppDelegate.m:

 #import "AppDelegate.h" #import <FBSDKCoreKit/FBSDKCoreKit.h> @interface AppDelegate () @end @implementation AppDelegate - (void)applicationDidBecomeActive:(UIApplication *)application { [FBSDKAppEvents activateApp]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[FBSDKApplicationDelegate shanetworkingInstance] application:application didFinishLaunchingWithOptions:launchOptions]; return YES; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[FBSDKApplicationDelegate shanetworkingInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; } @end 

y mi ViewController.m:

 #import "ViewController.h" #import <FBSDKCoreKit/FBSDKCoreKit.h> #import <FBSDKLoginKit/FBSDKLoginKit.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init]; loginButton.readPermissions = @[@"public_profile", @"email", @"user_friends"]; [loginButton setLoginBehavior:FBSDKLoginBehaviorSystemAccount]; // No difference loginButton.center = self.view.center; [self.view addSubview:loginButton]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

Y una captura de pantalla de Info.plist:

Info.plist

Finalmente, también estoy recibiendo estos dos errores en la console:

 2015-11-24 11:50:42.855 lixo[26941:389756] -canOpenURL: failed for URL: "fbauth2:/" - error: "(null)" 2015-11-24 11:50:42.860 lixo[26941:389756] -canOpenURL: failed for URL: "fbauth2:/" - error: "(null)" 

Aunque por lo que he leído esto se puede ignorar de forma segura si LSApplicationQueriesSchemes está configurado en Info.plist.

¿Alguna idea de cómo evitar esto?

¡Este es el comportamiento estándar!

Facebook SDK le permite iniciar session en Facebook desde la aplicación de Facebook (si está instalado en su teléfono), O bien, administrará el inicio de session desde Safari. Y cuando su aplicación utiliza Facebook para iniciar session en Safari, así es como tiene que aceptar el permiso cada vez.

Otro comportamiento es que si su iPhone no tiene una aplicación de Facebook y usa el process de inicio de session de Facebook SDK desde su aplicación, usará Safari; no podrás cerrar session, ya que Safari guarda tus cnetworkingenciales en cookies y no hay forma de que puedas borrar las cookies de safari de tu aplicación.

Si su teléfono tiene una aplicación de Facebook, se networkingirigirá a su aplicación sin interrupciones como tal.

EDITAR:

Este comportamiento también se encuentra en iOS 10. Gracias por la edición – Tiois

En lugar de activar un inicio de session en cada lanzamiento, puede verificar el estado del token de acceso. Si no ha caducado, omite el inicio de session y simplemente comienza a usar la API. El siguiente método se puede usar para verificar si el token ha caducado:

 +(BOOL) accessTokenIsLocalyValid { return [FBSDKAccessToken currentAccessToken] && [[NSDate date] compare:[FBSDKAccessToken currentAccessToken].expirationDate] == NSOrdenetworkingAscending; } 

Si tiene un token válido, puede actualizarlo usando [FBSDKAccessToken refreshCurrentAccessToken:] .

Compruebe si hay una session actual antes de iniciar session con FBSDKLoginManager .

 if ([FBSDKAccessToken currentAccessToken]) { NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]); // Now get details using graphpath. } else { // login with permissions using FBSDKLoginManager and get details using graphpath in completion }