我按照 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;
}