Я работаю над проектом статической библиотеки для MacOS, который мы конвертируем из iOS.Я абсолютно новичок в MacOS.Тем не менее, я искал проблему и нашел похожие сообщения, но моя проблема не была решена, и поэтому этот пост здесь.
Я использовал в качестве ссылки https://developer.apple.com/videos/play/wwdc2013/709/ это видео.Сначала я хочу проверить, существует ли ключ в связке ключей MacOS, и удалить его, если он найден.Затем создайте новый, чтобы сохранить.Извините, я не могу быть абсолютно открытым для исходного кода, но я попытаюсь объяснить ситуацию.
Во-первых, этот кусок кода работает отлично (на основе видео выше):
NSData *data = [[NSData alloc] initWithBase64EncodedString:@"A_RANDOM_BASE_64_STRING" options:0];
if (!data) {
NSLog(@"No Data! Break here!");
}
NSString *tag = @"MAC_TEST_TAG";
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];
NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
[publicKey setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[publicKey setObject:(id)@"myService" forKey:(id)kSecAttrService];
[publicKey setObject:(id)@"myAccount" forKey:(id)kSecAttrAccount];
[publicKey setObject:(id)data forKey:(id)kSecValueData];
[publicKey setObject:(id)d_tag forKey:(id)kSecAttrApplicationTag];
// Saving the data
OSStatus status = SecItemAdd((CFDictionaryRef)publicKey, NULL);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));
// Deleting the data
status = SecItemDelete((CFDictionaryRef)publicKey);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));
Но когда я пытаюсь сделать следующее, я получаю 2 ошибки:
NSData *data = [[NSData alloc] initWithBase64EncodedString:@"A_RANDOM_BASE_64_STRING" options:0];
if (!data) {
NSLog(@"No Data! Break here!");
}
NSString *tag = @"MAC_TEST_TAG";
NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];
NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];
[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[publicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[publicKey setObject:(id)data forKey:(id)kSecValueData];
[publicKey setObject:(id)d_tag forKey:(id)kSecAttrApplicationTag];
// Deleting the data
OSStatus status = SecItemDelete((CFDictionaryRef)publicKey);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));
// Saving the data
status = SecItemAdd((CFDictionaryRef)publicKey, NULL);
NSLog(@"%@", SecCopyErrorMessageString(status, nil));
Для первого NSLog, он говорит, (-25300) " Указанный элемент не может быть найден вцепочка для ключей."А для второй, он говорит, (-25299)" Указанный элемент уже существует в цепочке для ключей."
У меня сложилось впечатление, что
[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
Это утверждение (особенно kSecClassKey ) каким-то образом конфликтует.И , вероятно, , только в первый раз операция сохранения прошла успешно.Однако в аналогичной реализации iOS это не показало никаких проблем.Поскольку мое требование заключается в том, чтобы хранить ключ типа RSA в связке ключей MacOS, я затрудняюсь с тем, что делать в данный момент.
Любая помощь, рекомендации, ссылки будут очень благодарны.Спасибо.