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 に答える