Я занимаюсь разработкой приложения для iPad2, которому нужно написать некоторые элементы в связке ключей, но я не хочу, чтобы оно копировалось на каждом подключаемом компьютере, выполняя резервное копирование / восстановление устройства. Я использую ключ kSecAttrAccessible, чтобы выбрать вид доступа, который я хочу, со значением kSecAttrAccessibleWhenUnlockedThisDeviceOnly, чтобы быть уверенным, что если я сделаю резервную копию всех вещей, находящихся на устройстве, цепочка для ключей не будет присутствовать в этой резервной копии.
Итак, я поступаю следующим образом: я сбрасываю цепочку для ключей, вставляю элемент в цепочку для ключей и выгружаю все содержимое цепочки для ключей, так что я вижу, что этот элемент есть. Затем я делаю резервную копию iPad. Я сбрасываю цепочку для ключей и восстанавливаю резервную копию, поэтому в цепочке для ключей не должно быть ключей, если процедура восстановления не связана с цепочкой для ключей. В следующий раз, когда я запускаю приложение, я сбрасываю содержимое цепочки для ключей, и ключ там, так что он не работает так, как должен. Я использую iphone-lib (http://code.google.com/p/iphone-lib/) для сброса и сброса учетных данных на моем iPad. Моя версия SDK 4.3.
Код, который я использую для вставки предмета в цепочку для ключей, следующий:
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
NSData* identifier = [@"mypassword" dataUsingEncoding: NSASCIIStringEncoding];
[dic setObject:(id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(id)kSecAttrAccessible];
[dic setObject:identifier forKey:(id)kSecAttrGeneric];
[dic setObject:@"myaccount" forKey:(id)kSecAttrAccount];
[dic setObject:@"myservice" forKey:(id)kSecAttrService];
[dic setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
[dic setObject:identifier forKey:(id)kSecValueData];
OSStatus error = SecItemAdd((CFDictionaryRef)dic, NULL);
Спасибо!