2011-04-06 20 views
19

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.¿El SDK de iOS de Facebook requiere que el usuario se autentique cada vez que usa la aplicación?

Este método requiere que el usuario se autentique (en la aplicación de Facebook o en Safari) y luego retira el control a mi aplicación de 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.

así que tengo dos preguntas:

  1. ¿El usuario siempre tiene que volver a autorizar el fin de hacer que Facebook llama? 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 comprobar si mi aplicación ya tiene permiso, para que el usuario no tenga que ver ese mensaje y presione Aceptar?

+0

Usted Tienes que guardar el accessToken y expirationDate tú mismo. Verifique mi respuesta para el código. –

Respuesta

23

Desafortunadamente, el SDK de Facebook no lo maneja automáticamente. Aparte de la construcción en el SDK de ti mismo, la forma más fácil es como tal:

Cada vez que se 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 ahorrado nada en los NSUserDefaults, entonces nula se establecerá valores . 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 al

[facebook authorize:permissions delegate:self]; 

como de costumbre.

continuación, asegúrese de apoyar el siguiente método 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.

+0

Gracias, Daniel. He leído que la fecha de caducidad predeterminada es de solo 24 horas desde el inicio de sesión. ¿Ha sido esa tu experiencia? – Bill

+2

De hecho, 24h, pero casi siempre pido el permiso "acceso_acceso_acceso", que le otorga una validez de por vida infinita (salvo que el usuario rechace el permiso manualmente). –

+0

Ya veo. Necesito iniciar sesión únicamente para la acción photos.upload. Si solicito offline_access y almaceno el token, ¿funcionará? Pensé que offline_access era estrictamente para datos de solo lectura, pero podría estar equivocado. – Bill

2

1) No, tenía que ver Facebook *fbConnect = [[Facebook alloc] init]; [fbConnect logout:self]; para obtener la sesión de usuario de distancia

2) supongo que se podría llamar la accestoken en Facebook.m para comprobar que

4

Cuando el usuario inicia sesión, Obtendrás un token de acceso y una fecha de vencimiento. Guarde el token de acceso y puede 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 algunas veces, por lo que el usuario debe iniciar sesión si falla una solicitud.

6

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

1) ¿El usuario siempre tiene que volver a autorizar para hacer llamadas a Facebook ? Siempre pensé que salvaría el token de acceso en algún lugar, tal vez en por defecto del usuario, por lo que no necesitaría volver a autorizar.

La causa de tener que pasar por la señal de proceso cada vez es que, después de firmar con éxito en el primer tiempo, el Facebook SDK no guarda el token de acceso de una manera persistente.

2) Si el usuario no tiene que volver a autorizar cada vez, hay una manera para comprobar si mi aplicación ya tiene permiso, por lo que el usuario no tiene para ver ese mensaje y pulse ¿Bueno?

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

@albertamg Esto es exactamente como lo hago y las cosas funcionan perfectamente, pero una de las preguntas que tengo es que Facebook usa el inicio de sesión único, lo que significa que si estoy conectado a mi aplicación de Facebook en mi iPhone, no no tiene que volver a iniciar sesión en otra aplicación, ¿verdad?Pero la aplicación puede guardar el acceso y la fecha de caducidad solo en el método fbDIdLogin y los métodos se invocan solo después de que el usuario ingresa su credencial en la página de inicio de sesión, idealmente el usuario no debería necesitar ingresar su credencial e incluso el no debería ver la página de inicio de sesión, todo lo que ve la primera vez es "permitir el acceso a esta aplicación" pantalla – Yogesh

+0

@yogesh Aquí hay dos cosas que suceden: el usuario que inicia sesión y el usuario que autoriza su aplicación. Como dijiste, Facebook utiliza el inicio de sesión único (al menos la versión actualizada de la SDK). Si el usuario ya inició sesión (en el dispositivo), él/ella todavía tiene que autorizar su aplicación (si aún no lo ha hecho). Por lo tanto, si el usuario no ha iniciado sesión, se le redirigirá a la página de inicio de sesión y luego a la página autorizante. Si el usuario ya inició sesión, será redirigido directamente a la página de autorización. – albertamg

+0

@albertamg Gracias por la respuesta, así que esto es lo que está sucediendo, la primera vez que el usuario accede a mi aplicación, ve una pantalla de inicio de sesión y tiene que ingresar su credencial, supongo que esto no debería suceder ya que ya está conectado en la aplicación de Facebook en el teléfono, pero sí tiene que autorizar la aplicación, lo cual está bien, lo que me molesta es por qué tiene que iniciar sesión a pesar de que ha iniciado sesión en la aplicación de Facebook – Yogesh

0

Aquí es enfoque más real de respuesta @ Daniel Amitay:
En controlador de vista con el botón de inicio de sesión se escribe

//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 AppDelegate el archivo func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool se escribe siguiendo

//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) 
} 
Cuestiones relacionadas