Я храню общие пароли в цепочке для ключей, следуя примеру кода Apple в «Руководстве по программированию служб цепочки для ключей».
Все работает нормально, пока я запускаю приложение в режиме отладки из Xcode. Однако, когда я архивирую и экспортирую приложение, оно по-прежнему будет хранить пароли (видимые в Keychain Access), но не сможет их получить.
Связка ключей постоянно возвращает errSecAuthFailed (-25293). Это происходит на горном льве, но не на снежном барсе. Мое приложение подписано кодом и находится в песочнице. Мне кажется, что при получении пароля связка ключей не распознает приложение как то же самое, в котором хранится пароль, потому что, когда я устанавливаю пароль, доступный любому приложению, он также работает хорошо.
Я использую следующий код:
+ (NSString*) retrievePasswordFromKeychainWithKey: (NSString*) theKey {
SecKeychainUnlock(NULL, 0, NULL, FALSE);
const char* userNameUTF8 = [NSUserName() UTF8String];
uint32_t userNameLength = (uint32_t)strlen(userNameUTF8);
uint32_t serviceNameLength = (uint32_t)strlen([theKey UTF8String]);
uint32_t pwLength = 0;
void* pwBuffer = nil;
SecKeychainItemRef itemRef = nil;
OSStatus status1 = SecKeychainFindGenericPassword (NULL, serviceNameLength, serviceNameUTF8, userNameLength, userNameUTF8, &pwLength, &pwBuffer, &itemRef);
if (status1 == noErr) {
NSData* pwData = [NSData dataWithBytes:pwBuffer length:pwLength];
SecKeychainItemFreeContent (NULL, //No attribute data to release
pwBuffer //Release data buffer allocated by SecKeychainFindGenericPassword
);
return [NSString stringWithCString:[pwData bytes] encoding:NSUTF8StringEncoding];
}
//status1 is always -25293
return nil;
}