2012-04-24 26 views
10

Me gustaría utilizar una función de inicio de sesión automático. Entonces, cuando el usuario abre la aplicación, es delegado en una "pantalla de inicio de sesión". Cuando inició sesión correctamente, debe ser dirigido a su cuenta. Yo llamo a esto la "pantalla de cuenta". Ahora, cuando el usuario reinicia la aplicación, debe dirigirse directamente a su cuenta, sin ver la "pantalla de inicio de sesión".iOS: ¿Cómo autenticar a un usuario después de iniciar sesión (para inicio de sesión automático)?

La función de inicio de sesión ya funciona bien en mi proyecto (el nombre de usuario y la contraseña se guardan en UserDefault), pero cada vez que cierro la aplicación, tengo que volver a iniciar sesión. Entonces mi pregunta es: ¿cómo iniciar sesión automáticamente el usuario? O mejor dicho: ¿cómo puedo verificar si los datos (guardados en UserDefault) son los mismos que en la base de datos (MYSQL)?

+2

no tengo idea de lo que está tratando de pedir ... – BastiBen

+0

simplemente establezca una etiqueta, tal vez llamada "inicio de sesión" BOOL, en UserDefaults, luego detecte cuando aplica – adali

+1

ya que está almacenando la información de inicio de sesión en userDefaults, ¿cuál es el problema para verificar si esta información existe y de no mostrarla? pantalla de ingreso al sistema ?? –

Respuesta

0

Para responder a la pregunta: si desea iniciar sesión automáticamente con datos de llavero, utilice el marco libre "SFHFKeychainUtils". Guarda el nombre de usuario, la contraseña y el nombre del servicio en el llavero. si desea recuperarlo, solo guarde el nombre de usuario en NSUserDefaults y podrá obtener la contraseña con facilidad.

Aquí vamos:

SiFi HiFi Marco:https://github.com/ldandersen/scifihifi-iphone/tree/master/security

SiFi Marco de alta fidelidad (ARC compatibles):https://stackoverflow.com/a/10348964/1011125

Cómo utilizar SFHFKeychainUtils:http://gorgando.com/blog/technology/iphone_development/simple-iphone-tutorial-password-management-using-the-keychain-by-using-sfhfkeychainutils

+0

Tenga cuidado al publicar copiar y pegar las respuestas al pie o repetidas a múltiples preguntas, estas tienden a ser señaladas como "spam" por la comunidad. Si está haciendo esto, generalmente significa que las preguntas son duplicadas, por lo tanto, márquelas como tales. – Kev

+0

bien, gracias. Lo tendré en cuenta para la próxima vez .. – filou

22
  1. Por primera vez cuando el usuario inicia sesión, guarda las credenciales del usuario en el llavero de iPhone.
  2. Cuando la aplicación se abre de nuevo, comprueba si las credenciales de usuario son presentes en el llavero y, en caso afirmativo, el código debe llamar a la lógica de inicio de sesión y hacer un inicio de sesión automático y acceder a la pantalla después de iniciar sesión. Si no, , entonces debe mostrar la pantalla de inicio de sesión. Puede hacer esta lógica en AppDelegates applicationDidFinishLaunching.
  3. Cuando el usuario haga clic en el botón Cerrar sesión, primero quite las credenciales de usuario del llavero y vuelva al controlador de inicio de sesión.

Simplemente agrega credenciales de inicio de sesión al llavero cuando el usuario inicia sesión y solo lo elimina cuando el usuario hace clic en el botón de cerrar sesión. Si el usuario sale de la aplicación sin cerrar la sesión, las credenciales seguirán en el llavero y podrá recuperarlas cuando el usuario regrese a la aplicación.

EDIT: Creo que debo añadir una más thing..If su lógica de inicio de sesión requiere tiempo (como se conecte mediante solicitud web o algo así), poner el código de la lógica de inicio de sesión en su sesión ViewController en lugar de ApplicationDelegate, y el uso cualquier indicador de actividad durante el proceso de inicio de sesión automático.

EDIT: Edité toda la respuesta, sustituí NSUserDefault por Llavero. El hilo This explica por qué.

+0

muchas gracias por esta respuesta clara. ¿Qué quieres decir con "lógica de inicio de sesión"? – filou

+1

@SaschaWieland Si su inicio de sesión requiere alguna solicitud/respuesta web, llevará tiempo. Por lógica de inicio de sesión simplemente me refiero al proceso de inicio de sesión real. – Krishnabhadra

2

Al guardar Nombre de usuario y Contraseña, se recomienda guardar en Llavero en lugar de NSUserDefaults. Refiera esto post para una mejor comprensión.

+0

Utilicé el llavero, pero ¿puedes decirme cómo iniciar sesión con los datos del llavero? es bastante pesado para obtener datos de la cadena para un autologin. – filou

+0

Supongo que utilizó un servicio web para autenticar la contraseña de usuario por primera vez. En cada lanzamiento consecutivo, elija el nombre de usuario y la contraseña de su llavero y use el mismo servicio web para autenticar al usuario. Al autenticarse, puede mostrar una pantalla de carga para notificar al usuario. – Roshit

+0

si establece los detalles en el llavero con el código '[keychainItem setObject: @" password "forKey: kSecValueData]; [keychainItem setObject: @ "username" forKey: kSecAttrAccount]; ', luego puede recuperar los detalles utilizando' NSString * password = [keychainItem objectForKey: kSecValueData]; NSString * username = [keychainItem objectForKey: kSecAttrAccount]; ' – Roshit

0

Usé una combinación de N SUserDefaults y SSKeychain. Usé NSUserDefaults para almacenar el nombre de usuario y SSKeychain para almacenar la contraseña.

Este es el código que se utiliza para guardar las credenciales

NSString *user = self.username.text; 
NSString *password = self.pass.text; 
[SSKeychain setPassword:password forService:@"achat" account:user]; 
NSUserDefaults *dUser = [NSUserDefaults standardUserDefaults]; 
[dUser setObject:user forKey:@"user"]; 
[dUser synchronize]; 

Este es el código que se utiliza para recuperar las credenciales

NSUserDefaults *eUser = [NSUserDefaults standardUserDefaults]; 
NSString *savedUser = [eUser objectForKey:@"user"]; 

    if (!savedUser) { 
     UIAlertView *uhoh = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"Please enter your username and password." delegate:self cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil]; 
     [uhoh show]; 
    } 

    else { 
      NSString *savedPass = [SSKeychain passwordForService:@"achat" account:savedUser]; 
      self.username.text = savedUser; 
      self.pass.text = savedPass; 
     } 
Cuestiones relacionadas