キーチェーンを作成してから、事前定義された信頼できるアプリケーション リストを含む項目を追加しています。
SecKeychainCreate([keychainPath UTF8String], (UInt32)strlen(keychainPass), keychainPass, FALSE, NULL, &someKeychain);
OSStatus someStatus = SecKeychainItemCreateFromContent(kSecGenericPasswordItemClass, &list, len, encryptedPass, someKeychain, accessRef, &someKeychainItem);
Keychain Access アプリケーションで新しく作成したキーチェーンを開くと、信頼できるアプリのリストに自分のアプリケーションが表示されます。
問題は、信頼できるアプリケーションの 1 つを介してそのキーチェーンからキーを読み取ろうとしたときです。
SecKeychainUnlock(someKeychain, (UInt32)strlen(keychainPass), keychainPass, TRUE);
UInt32 passwordLen = 0;
void *passData = nil;
const char *cUser_name = [NSUserName() cStringUsingEncoding:NSUTF8StringEncoding];
OSStatus genericPassErr = SecKeychainFindGenericPassword(someKeychain, 0, NULL, strlen(cUser_name), cUser_name, &passwordLen, &passData, NULL);
genericPassErr
に等しい-25293
、つまり
Error: 0xFFFF9D33 -25293 The user name or passphrase you entered is not correct.
コードの前半で を実行SecKeychainSetUserInteractionAllowed(0)
し、この行をコメントアウトすると、アプリケーションがキーチェーンにアクセスする許可を求めるプロンプトがシステムから表示されます。許可すると、すべて正常に実行されます。ただし、要点は、ユーザーにプロンプトを表示せずにそれを実行できる必要があるということです。アプリを ACL に追加したので、このように動作することを期待しています。私が間違っていることを知っていますか?
添付のスクリーンショットで「すべてのプログラムがこのアイテムにアクセスできる」ラジオボックスにチェックを入れると、すべてがプロンプトなしで機能します。しかし、リストされているアプリだけにアクセスできるようにしたくありません。