我正在尝试编写一些从NSMutableArray生成的数据,如此
// set up keychain so I can write to it… or read if needed (specially for testing)
KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"KeychainTest" accessGroup:nil];
[keychain setObject:(__bridge id)(kSecAttrAccessibleWhenUnlocked) forKey:(__bridge id)(kSecAttrAccessible)];
//write to keychain
NSData *parsedRemoteSitesData = [NSKeyedArchiver archivedDataWithRootObject:parsedRemoteSitesMutableArray]; // converts MutableArray to NSData
[keychain setObject:parsedRemoteSitesData forKey:(__bridge id)(kSecValueData)]; pass data to keychain
我的应用程序崩溃在那里我试图将NSData传递给钥匙串的最后一行,这是它给出的错误。
** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMutableData dataUsingEncoding:]: unrecognized selector sent to instance
我认为这意味着我在将数组传递给它时没有编码我的NSData,但我不确定..我希望有人可以告诉我或提供一些示例代码来解决这个问题。
任何帮助将不胜感激。
答案 0 :(得分:8)
我使用以下方法成功存储了自定义NSObject:
NSData * data = [NSKeyedArchiver archivedDataWithRootObject: myObject];
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"com.sth.sth" accessGroup:nil];
[keychainItem setObject:data forKey:kSecAttrAccount];
[keychainItem release];
并使用以下方式获取:
NSData * data;
KeychainItemWrapper *keychainItem = [[[KeychainItemWrapper alloc] initWithIdentifier:@"com.sth.sth" accessGroup:nil]autorelease];
data = [keychainItem objectForKey:kSecAttrAccount];
MyObject *obj = [NSKeyedUnarchiver unarchiveObjectWithData:data];