我最近正在为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)“ 在钥匙串中找不到指定的项目。”。对于第二个NSLog,它表示(-25299)“ 指定的项已存在于钥匙串中。“
我的印象是
[publicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
此语句(特别是 kSecClassKey )存在某种冲突。而且可能,这是第一次,保存操作成功。但是,在类似的iOS实现中,它没有出现问题。由于我的要求是将RSA类型的密钥存储在MacOS的钥匙串中,因此我不知所措。
任何帮助,指南,参考将不胜感激。谢谢。