2011-08-12 21 views
5

que he estado tratando de utilizar la llave en IOS para almacenar algunos pequeños trozos de información - cadenas de contraseñas, tokens de OAuth, etc. Estoy usando el código de ejemplo KeychainItemWrapper que Apple ofrece aquí: https://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797¿Funciona realmente el llavero en iOS?

I' ¡Lo encontré extremadamente con errores! Algunas veces funciona, otras veces mi aplicación se cuelga al tratar de almacenar valores de cadena en el llavero, particularmente cuando algo ya estaba configurado. Otras veces, exactamente las mismas llamadas funcionan bien. Los errores ocurren en dispositivos reales, no en el simulador.

La forma en que suelen escribir en el llavero es así:

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"password" accessGroup:nil]; 
[wrapper setObject:thePasswordString forKey:(id)kSecValueData]; 
[wrapper release]; 

Por lo tanto, lo que me gustaría saber es: estoy haciendo algo mal, es el código de ejemplo de Apple tiene la culpa, o es la API de llavero iOS subyacente real roto?

Respuesta

4

He encontrado que SFHFKeychainUtilities es un envoltorio extremadamente útil. Proporciona una API muy simple que se parece a esto:

[SFHFKeychainUtils storeUsername:usernameInput andPassword:passwordInput forServiceName:@"foo" updateExisting:TRUE error:&error]; 

Aquí hay un tutorial útil: http://gorgando.com/blog/tag/sfhfkeychainutils

trabaja todo el tiempo para mí.

¡Buena suerte!

+0

Gracias Thomas! He traído SFHFKeychainUtils a mi aplicación, y hasta ahora todo va bien. Lo probaremos y lo haremos por un tiempo, pero parece una gran mejora con respecto a KeychainItemWrapper hasta el momento. Puntos de bonificación por lo fácil que fue integrar y comenzar a funcionar. – Eschaton

+0

Willdo, simplemente realizando mi due diligence primero :) – Eschaton

+0

Definitivamente deberías :) Diviértete. –

1

El KeychainItemWrapper de Apple realmente funciona - Lo estoy usando en una de mis aplicaciones para almacenar datos de IAP. Lo que he encontrado, sin embargo, es que no siempre parece funcionar si su dispositivo tiene jailbreak. No estoy seguro de qué sucede con el llavero cuando un dispositivo está liberado, pero algunos de mis probadores beta informaron que los IAP no siempre se aplican cuando su dispositivo está liberado.

Parece que está utilizando la clase correctamente.

+0

Mi dispositivo no es jailbreak, pero no es sorprendente que no habría problemas con los dispositivos con jailbreak y el llavero. En cualquier caso, parece que la respuesta de Thomas 'SFHFKeychainUtils' anterior funciona de manera más confiable que' KeychainItemWrapper'. – Eschaton

+0

en realidad voy a investigar 'SFHFKeychainUtils', también – larsacus

3

Tuve muchos problemas con esta envoltura. No sé por qué, pero debe guardar en KSecAttrAccount con el mismo identificador y antes de guardar el kSecValueData.

Guardar como esto:

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyIdentifier" accessGroup:nil]; 

[keychain setObject:@"MyIdentifier" forKey:(id)kSecAttrAccount]; 

[keychain setObject:[passwordFirst text] forKey:(id)kSecValueData]; 
Cuestiones relacionadas