5

「キーチェーンサービスプログラミングガイド」の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;   
}
4

1 に答える 1

6

OK、これが Mac OS 10.8.0 の未解決のバグであることを知りました。開発者 ID で署名されたアプリは、キーチェーンのデータにアクセスできません。これが10.8.1で修正されることを願っています...

回避策は、開発者 ID でアプリに署名しないことです。(Lion で構築されたアプリはこのバグの影響を受けないことも読みましたが、まだテストできていません)

于 2012-08-09T12:28:52.990 に答える