Не удалось добавить элемент цепочки для ключей.Ошибка - 25299 после изменения идентификатора с помощью KeychainItemWrapper? - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу сохранить UUID в связке ключей с KeychainItemWrapper, поэтому я добавляю следующие методы в MyKeychainManager.m :

#define keychain_idenentify @"com.myapp.bundle1"

+ (void)saveUUID:(NSString *)UUID{
  if([MyKeychainManager getUUID].length > 0) {
    return;
  }
  KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc]initWithIdentifier:keychain_idenentify accessGroup:nil];
  [keychain setObject:UUID forKey:(__bridge id)kSecAttrLabel];
}

+ (NSString *)getUUID {
  KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc]initWithIdentifier:keychain_idenentify accessGroup:nil];

  NSString *uuidString = [keychain objectForKey:(__bridge id)kSecAttrLabel];
  return uuidString;
}

Но после изменения keychain_idenentify в com.otherApp.bundle , произошел сбой при

result = SecItemAdd ((CFDictionaryRef) [self dictionaryToSecItemFormat: keychainItemData], NULL);NSAssert (result == noErr, @ "Не удалось добавить элемент цепочки для ключей.");

, ошибка: Ошибка - 25299

Почемуэто и как это решить?Какой я должен выбрать, например kSecAttrLabel ?Я изменил его на kSecAttrService это работает весело, но я не знаю, есть ли другие потенциальные ошибки.

Любая помощь будет признательна.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Я потратил много дней на борьбу с той же проблемой.Наконец, я нашел причину того, что я прохожу слишком легко.

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

KeychainItemWrapper *test1 = [[KeychainItemWrapper alloc] initWithIdentifier:@"test10"  accessGroup:nil];
[test1 setObject:(id)@"value1" forKey:(id)kSecValueData];
//Normally it works

KeychainItemWrapper *test2 = [[KeychainItemWrapper alloc] initWithIdentifier:@"test20"  accessGroup:nil];
//At this point , we meet the crash with the message of 'Couldn't add the Keychain Item.'
[test2 setObject:(id)@"value2" forKey:(id)kSecValueData];

Даже если имя 'initWithIdentifier' отличается, константа 'kSecAttrAccount' должна быть уникальной.Его значение по умолчанию - "" (пусто).Как только обертка цепочки для ключей используется, 'kSecAttrAccount' сохраняется.Поэтому вам нужно уделять большое внимание kSecAttrAccount, когда вы используете другой initWithIdentifier.

Я могу исправить сбой вышеуказанных кодов, добавив некоторые коды.

    KeychainItemWrapper *test1 = [[KeychainItemWrapper alloc] initWithIdentifier:@"test10"  accessGroup:nil];
[test1 setObject:@"test1" forKey:(id)kSecAttrAccount];
[test1 setObject:(id)@"value1" forKey:(id)kSecValueData];

KeychainItemWrapper *test2 = [[KeychainItemWrapper alloc] initWithIdentifier:@"test20"  accessGroup:nil];
[test2 setObject:@"test2" forKey:(id)kSecAttrAccount];
[test2 setObject:(id)@"value2" forKey:(id)kSecValueData];

ДляДля получения дополнительной информации, если вы используете группу доступа KeychainItemWrapper, как я упоминал выше, kSecAttrAccount должен быть уникальным независимо от того, используется ли accessGroup или нет.

Ниже приведен пример.

KeychainItemWrapper *test = [[KeychainItemWrapper alloc] initWithIdentifier:@"test"  accessGroup:"App_ID.SampleName"];

Каквы знаете, App_ID должен быть создан у разработчика Apple, а SampleName должен быть настроен на возможности KeyChain Sharing цели вашего приложения."."между App_ID и SampleName необходимо добавить.Это ключевой момент.

Пожалуйста, обратитесь к публикациям других людей о том, как его установить.

0 голосов
/ 29 апреля 2019

Эта ошибка означает, что элемент с таким идентификатором уже существует (https://osstatus.com/search/results?platform=all&framework=all&search=-25299). Попробуйте удалить его из цепочки для ключей, и тогда ваш код должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...