Идентификатор клиента Apple Keychain Store, чтобы только мое приложение могло получить к нему доступ

цель

Мне нужно хранить личность клиента в приложении OS X таким образом, чтобы только мое приложение могло получить к нему доступ. Нет запроса о разрешении.

проблема

Проблема появилась сразу, когда я пытался сохранить личность клиента. Вот пример кода (что я связал до сих пор):

- (BOOL)saveClientIdentity:(SecIdentityRef)clientIdentity error:(NSError**) error
{
    NSDictionary *attributes = @{
        (__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlwaysThisDeviceOnly,
        (__bridge id)kSecValueRef:(__bridge id)clientIdentity,
        (__bridge id)kSecAttrApplicationTag:[kMyKeychainAttrApplicationTag dataUsingEncoding: NSUTF8StringEncoding],
        (__bridge id)kSecAttrAccessGroup:kMyKeychainAttrAccessGroup
    };

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL);
    // status == -25299
    …
}

Я постоянно получаю код -25299 и инструмент expalint, проблема:

$ security error -25299
Error: 0xFFFF9D2D -25299 The specified item already exists in the keychain.

Поэтому он пытается переопределить глобальную идентификацию клиента (мне никогда не удавалось написать идентификацию клиента для этого приложения, поэтому такого конфликта быть не должно), и я не знаю, что делать. Это должно быть частным только для этого приложения.

Я проверил, что происходит для соответствующего кода загрузки. Он загружает мою личность разработчика, и я не хочу этого.

- (SecIdentityRef)clientIdentity
{
    NSDictionary *attributes =
    @{
      (__bridge id)kSecClass:(__bridge id)kSecClassIdentity,
      (__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlwaysThisDeviceOnly,
      (__bridge id)kSecAttrApplicationTag:[kMyKeychainAttrApplicationTag dataUsingEncoding: NSUTF8StringEncoding],
      (__bridge id)kSecAttrAccessGroup:kMyKeychainAttrAccessGroup
      };

    CFTypeRef universalResult = NULL;
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)attributes, &universalResult);
    SecIdentityRef result = (SecIdentityRef)universalResult;
    if (result)
    {
        CFAutorelease(result);
    }
    if (status != noErr)
    {
        NSLog(@"Failed to load client identity: %@", NSErrorFromStatusErrorCode(status));
    }
    return result;
}
Заметки

Мне нужно использовать тот же код для iOS, но здесь не должно быть никаких проблем, поскольку по умолчанию брелок iOS не распределяется между приложениями.

Ответы на вопрос(2)

Ваш ответ на вопрос