4

我正在尝试编写一些从这样的 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 进行编码,但我不确定.. 我希望有人可以告诉我或提供一些示例代码来解决这个问题。

任何帮助将不胜感激。

4

1 回答 1

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];
于 2013-10-08T15:24:21.383 回答