「キーチェーンサービスプログラミングガイド」のAppleのサンプルコードに従って、一般的なパスワードをキーチェーンに保存しています。
Xcodeからデバッグモードでアプリを実行している限り、すべてが正常に機能します。ただし、アプリをアーカイブしてエクスポートすると、パスワードは保存されますが(キーチェーンアクセスに表示されます)、パスワードを取得できません。
キーチェーンは常にerrSecAuthFailed(-25293)を返します。これはMountainLionで発生しますが、SnowLeopardでは発生しません。私のアプリはコード署名され、サンドボックス化されています。私には、パスワードを取得するときに、キーチェーンはアプリをパスワードを保存したものと同じものとして認識しないようです。これは、パスワードをどのアプリケーションからもアクセスできるように設定すると、それもうまく機能するためです。
私は次のコードを使用します:
+ (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;
}