unity react fbsdkloginkit fbsdkcorekit ios facebook facebook-ios-sdk

ios - react - fbsdkloginkit



¿El SDK de iOS de Facebook requiere que el usuario se autentique cada vez que usa la aplicación? (5)

1) No, tuve que hacer Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self]; Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self]; para alejar la sesión del usuario

2) Supongo que puede llamar al accestoken en Facebook.m para verificar que

Como se describe en el archivo README para facebook-ios-sdk, mi aplicación llama a Facebook # authorize: delegate: antes de realizar cualquier llamada API.

Este método requiere que el usuario se autentique (ya sea en la aplicación de Facebook o en Safari) y luego deja de controlar la aplicación de mi iPhone. El problema es que le pide al usuario que se autentique cada vez que llamo al método. Si ya otorgaron permiso a mi aplicación, reciben un mensaje que dice que la aplicación ya está autorizada y tienen que presionar Aceptar para volver a mi aplicación. No se ve muy profesional.

Entonces tengo dos preguntas:

  1. ¿El usuario siempre tiene que volver a autorizar para hacer llamadas de Facebook? Siempre pensé que guardaría el token de acceso en algún lugar, tal vez en los valores predeterminados del usuario, para que no necesites volver a autorizar.

  2. Si el usuario no tiene que volver a autorizar cada vez, ¿hay alguna manera de verificar si mi aplicación ya tiene permiso, por lo que el usuario no tiene que ver ese mensaje y presionar ¿Aceptar?


Cuando el usuario inicia sesión, obtendrá un token de acceso y una fecha de vencimiento. Guarde el token de acceso y podrá reutilizarlo siempre que aún no haya alcanzado la fecha de caducidad. El SDK de Facebook tiene un método para hacer esta comprobación: [fbConnect isSessionValid] pero parece dar falsos positivos a veces, por lo que el usuario debe iniciar sesión si falla una solicitud.


El problema es que le pide al usuario que se autentique cada vez que llamo al método. Si ya otorgaron permiso a mi aplicación, reciben un mensaje que dice que la aplicación ya está autorizada y tienen que presionar Aceptar para volver a mi aplicación.

1) ¿El usuario siempre tiene que volver a autorizar para hacer llamadas de Facebook? Siempre pensé que guardaría el token de acceso en algún lugar, tal vez en los valores predeterminados del usuario, para que no necesites volver a autorizar.

La causa de tener que pasar por el proceso de inicio de sesión todo el tiempo es que, después de iniciar sesión con éxito la primera vez, el SDK de Facebook no guarda el token de acceso de manera persistente .

2) Si el usuario no tiene que volver a autorizar cada vez, ¿hay alguna forma de comprobar si mi aplicación ya tiene permiso, para que el usuario no tenga que ver ese mensaje y presione Aceptar?

El hecho de que Facebook SDK no guarde el token de acceso no significa que no pueda hacerlo usted mismo. El siguiente código ilustra cómo guardar / recuperar el token de acceso de NSUserDefaults.

-(void)login { // on login, use the stored access token and see if it still works NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; facebook.accessToken = [defaults objectForKey:ACCESS_TOKEN_KEY]; facebook.expirationDate = [defaults objectForKey:EXPIRATION_DATE_KEY]; // only authorize if the access token isn''t valid // if it *is* valid, no need to authenticate. just move on if (![facebook isSessionValid]) { NSArray * permissions = [NSArray arrayWithObjects:@"read_stream", @"offline_access", @"email", nil]; [facebook authorize:permissions delegate:self]; } } /** * Called when the user has logged in successfully. */ - (void)fbDidLogin { // store the access token and expiration date to the user defaults NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:facebook.accessToken forKey:ACCESS_TOKEN_KEY]; [defaults setObject:facebook.expirationDate forKey:EXPIRATION_DATE_KEY]; [defaults synchronize]; }


Es lamentable que el SDK de Facebook no lo maneje automáticamente por nosotros. Además de incorporarlo al SDK, la forma más fácil es la siguiente:

Cada vez que asigna _facebook:

_facebook = [[Facebook alloc] initWithAppId:@"SuperDuperAppID"]; NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; NSString *accessToken = [prefs stringForKey:@"facebook-accessToken"]; NSString *expirationDate = [prefs stringForKey:@"facebook-expirationDate"]; _facebook.accessToken = accessToken; _facebook.expirationDate = expirationDate;

Si nunca ha guardado nada en NSUserDefaults, se establecerán valores nulos. No pasó nada De lo contrario, se establecerán los valores verdaderos, y [_facebook isSessionValid]; debe devolver VERDADERO, lo que indica buenos valores. Siga adelante y realice llamadas al SDK de Facebook como si estuvieran conectadas (que son). Si es falso, llame

[facebook authorize:permissions delegate:self];

como siempre.

Luego, asegúrese de admitir el siguiente método de delegado de Facebook:

- (void)fbDidLogin { NSString *accessToken = _facebook.accessToken; NSString *expirationDate = _facebook.expirationDate; NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:accessToken forKey:@"facebook-accessToken"]; [prefs expirationDate forKey:@"facebook-expirationDate"]; [prefs synchronize]; }

Utilizo este código en mi aplicación, y funciona perfectamente. Hice esto desde la memoria, así que me disculpo si no funciona en copiar y pegar. Puede haber un "mistype" en alguna parte, más una gestión de memoria incorrecta. No olvide que los tokens de acceso caducan a menos que obtenga un permiso sin conexión. En cualquier caso, el código anterior maneja todo.


Aquí hay un enfoque más real de la respuesta de @Daniel Amitay:
Controlador de vista con botón de inicio de sesión escribes

//saving user data to user defaults in order to support Facebook SSO let token = FBSDKAccessToken.currentAccessToken() let prefs = NSUserDefaults.standardUserDefaults() let nsdataToken = NSKeyedArchiver.archivedDataWithRootObject(token) prefs.setObject(nsdataToken, forKey: "facebook-AccessToken") prefs.synchronize()

En la func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool archivo AppDelegate func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool escribes a continuación

//restoring Facebook SSO session from user defaults let prefs = NSUserDefaults.standardUserDefaults() if let nsdataToken = prefs.valueForKey("facebook-AccessToken") as? NSData { let token = NSKeyedUnarchiver.unarchiveObjectWithData(nsdataToken) as! FBSDKAccessToken FBSDKAccessToken.setCurrentAccessToken(token) }