Служба связки ключей для iOS, ошибка удаления цепочки ключей

#ios #objective-c #iphone #keychain

#iOS #objective-c #iPhone #связка ключей

Вопрос:

Я написал проект, используя оболочку связки ключей iOS для хранения имени пользователя и пароля,
и проект отлично работал до вчерашнего дня.
После того, как я запустил команду clean для проекта, сбой проекта в:

 - (void)writeToKeychain
{
    NSDictionary *attributes = NULL;
    NSMutableDictionary *updateItem = NULL;

    // If the keychain item already exists, modify it:  
    if (SecItemCopyMatching((CFDictionaryRef)genericPasswordQuery,
                            (CFTypeRef *)amp;attributes) == noErr)
    {
        // First, get the attributes returned from the keychain and add them to the
        // dictionary that controls the update:
        updateItem = [NSMutableDictionary dictionaryWithDictionary:attributes];

    // Second, get the class value from the generic password query dictionary and
    // add it to the updateItem dictionary:
    [updateItem setObject:[genericPasswordQuery objectForKey:(id)kSecClass]
                   forKey:(id)kSecClass];

    // Finally, set up the dictionary that contains new values for the attributes:
    NSMutableDictionary *tempCheck = [self dictionaryToSecItemFormat:keychainData];

    //Remove the class--it's not a keychain attribute:
    [tempCheck removeObjectForKey:(id)kSecClass];

    // You can update only a single keychain item at a time.
    NSAssert(SecItemUpdate((CFDictionaryRef)updateItem,
                           (CFDictionaryRef)tempCheck) == noErr,
             @"Couldn't update the Keychain Item." );
}
else    
{
    // No previous item found; add the new item.
    // The new value was added to the keychainData dictionary in the mySetObject routine,
    //  and the other values were added to the keychainData dictionary previously.

    // No pointer to the newly-added items is needed, so pass NULL for the second parameter:
    //NSAssert(SecItemAdd((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainData],
    //                  NULL) == noErr, @"Couldn't add the Keychain Item." );       
    NSLog(@"%ld", SecItemAdd((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainData],NULL));
    NSLog(@"%ld", SecItemDelete((CFDictionaryRef)[self dictionaryToSecItemFormat:keychainData]));
}

}
  

Для отладки я комментирую NSAssert и добавляю 3 NSLog.
Однако я получил сообщение об ошибке:

-25299 (Ошибка secduplicateitem, элемент уже существует.)

из SecItemAdd и

-25300 (ошибка secitemnotfound, элемент не может быть найден.)

из SecItemDelete

Как мне удалить старый элемент связки ключей на моем устройстве?

Комментарии:

1. Я решил эту проблему по этой ссылке :

Ответ №1:

Я удаляю старый элемент связки ключей с помощью SecItemDelete.

    NSMutableDictionary* yourKeychainDictionary;
   OSStatus status = SecItemDelete((CFDictionaryRef)yourKeychainDictionary);