2013-03-26 2 views
2

Я использую ARCified KeychainItemWrapper и не удается перенести данные в один элемент связки ключей на другой элемент. В основном я пытаюсь скопировать содержимое из определенного приложения в общий элемент. Для краткости я только указал имя пользователя, так как оно не работает.KeychainItemWrapper migrating data throws error

KeychainItemWrapper *legacyKeychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"mainLogin" accessGroup:@"C35BXHSRSA.com.foo.bar"]; 
NSString *legacyUser = [legacyKeychainItem objectForKey:(__bridge id)kSecAttrAccount]; 

self.migratedKeychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"security" accessGroup:@"C35BXHSRSA.com.foo.security"]; 
// dies here 
[self.migratedKeychainItem setObject:legacyUser forKey:(__bridge id)kSecAttrAccount]; 

Он умирает в KeychainItemWrapper методе writeToKeychain бросание NSAssert(result == noErr, @"Couldn't update the Keychain Item.");

Глядя ошибку в Keychain Services Reference говорит мне

errSecDuplicateItem -25299 Пункт уже существует.

Я могу подтвердить эту проблему путем жесткого кодирования/изменения строки, и код работает отлично, но я пытаюсь перенести данные ... так что одинаково важно. Вопрос в том, почему это бросает ошибку, когда это два разных элемента keychain и как, черт возьми, я могу заставить его работать по своему желанию?

+0

Поскольку KeyChainItemWrapper не является классом из SDK iOS, можно только предположить, что вы, возможно, ссылались на [dhoerl/KeychainItemWrapper] (https://gist.github.com/dhoerl/1170641). – Till

+0

Это правильно. Исходная версия является частью примера кода Apple для Keychain Services. Затем кто-то сделал версию ARC'd, поэтому нам не нужно добавлять флаги complier каждый раз. – DBD

+0

Не так сложно исключить один файл из ARC –

ответ

1

У вас уже есть элемент keychain с «новым» именем пользователя и другими первичными ключами (учетная запись, служба и т. Д.), И это не тот, который вы обновляете. Таким образом, обновленный элемент сталкивается со старым элементом, и вы получаете -25299.

Вы можете добавить небольшой код отладки с помощью SecItemCopyMatching (запросить результат массива) и посмотреть.

Если вы уверены, что не хотите старый товар, удалите его. Если да, то вам нужна новая схема именования.

+0

У iOS-симулятора есть собственный брелок. Это хранится в '' ~/Library/Application \ Support/iPhone \ Simulator/6.0/Library/Keychains/'' на вашем Mac и НЕ является вашим логин-ключом (т. Е. Брелок для симулятора недоступен из Keychain Access) – quellish

+0

Oh Да. Я знал это. Обновленный ответ. Благодарю. – Stripes

+0

Обновлен код с соответствующей строкой. Ваш ответ имеет смысл, но, как вы можете (сейчас) видеть в коде, «legacyKeychainItem» и «migratedKeychainItem» имеют разные идентификаторы и разные группы доступа. – DBD