2011-08-19 9 views
15

Uso la clase KeyChainItemWrapper, proporcionada por el Código de muestra de Apple para guardar el token de autenticación en el llavero.Almacenamiento de claves en KeyChain con KeyChainItemWrapper

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

Pero cuando estoy tratando de establecer el valor de llavero, una excepción rara se eleva

[_authenticationTokenKeychain setObject:authenticationToken forKey: @"auth_token"]; 

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.'

El llavero no existe todavía (en el momento de esta convocatoria) ¿Qué puede causar esta excepción?

+1

Asegúrese de haber agregado el archivo de acceso de llavero. Eche un vistazo a http://stackoverflow.com/questions/5859615/iphone-debugging-the-generickeychain-example – nessalabs

Respuesta

33

Necesita utilizar teclas estándar, por lo que aquí su @"auth_token" es incorrecto.

The keys that can be used for this purpose and the possible values for each key are listed in the “Keychain Services Constants” section.

fuente, la lista de constantes válidas: Keychain Services Reference

Por ejemplo, se puede utilizar:

[_authenticationTokenKeychain setObject:authenticationToken forKey: (__bridge NSString *)kSecValueData];

+12

Al utilizar la versión ARC de keychainItemWrapper, debe hacerlo de la siguiente manera: '[_authenticationTokenKeychain setValue: authenticationToken forKey: (__ bridge NSString *) kSecValueData]; ' –

+1

@DamienMATHIEU Estoy usando la versión ARC pero sigo teniendo problemas. Me sale este error: '[ setValue: forUndefinedKey:]: esta clase no es un valor clave que cumple con la codificación para la clave v_Data.' ¿Alguna idea sobre que podría ir mal? – Interfector

+2

@Interfector en lugar de usar ** setValue **, use ** setObject ** – fdezjose

0
[_authenticationTokenKeychain setObject:authenticationToken forKey: @"auth_token"]; 

Para fragmento de código anterior, parámetro clave es que sólo puede utilizar las teclas provisto por sdk. Puede encontrar todo en SecItem.h

Cuestiones relacionadas