今天在用蘋果官方demo 提供的KeychainItemWrapper類時遇到-25299 reason: 'Couldn't add the Keychain Item.'錯誤,再4s上可以正常運行,但6上卻崩潰
崩潰位置
result = SecItemAdd((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainItemData], NULL);
NSAssert( result == noErr, @"Couldn't add the Keychain Item." );
我調用的方法
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
[keychainItem setObject:strUUID forKey:(__bridge id)kSecValueData];
通過看國外的文章知道了方法(http://stackoverflow.com/questions/4309110/error-saving-in-the-keychain-with-iphone-sdk)
修改方法: 加上下面這行代碼就能正常運行
[keychainItem setObject:@"MY_APP_CREDENTIALS" forKey:(id)kSecAttrService];
最后修改成代碼為:
[keychainItem setObject:@"MY_APP_CREDENTIALS" forKey:(id)kSecAttrService];
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));
[keychainItem setObject:strUUID forKey:(__bridge id)kSecValueData];
原因:
KeyChain內部以kSecAttrAccount 與kSecAttrService作為唯一鑰匙串標識,兩個都必須設置才行;