NSInternalInconsistencyException при обновлении элемента цепочки для ключей

Я использую связку ключей в своем приложении с keychainitemwrapper. Итак, я обновил «kSecAttrAccessible», используя метод setObject: (id).
Но случаются ошибки. Нравится,

Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Не удалось обновить элемент связки ключей».

а это мой источник

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserData" accessGroup:@"49YVVGB32W.com.covimdm.daelim.pushData"];
NSString *PushData = [NSString stringWithFormat:@"%@::%@::%@", sLoginId, [[[PushManager defaultManager] info] pushServiceID], [[[PushManager defaultManager] info] host]];
[wrapper setObject:PushData forKey:(id)kSecValueData];
[wrapper setObject:(id)kSecAttrAccessibleAfterFirstUnlock forKey:(id)kSecAttrAccessible];

Часть, где возникает ошибка, – это код четвертой строки.

[wrapper setObject:(id)kSecAttrAccessibleAfterFirstUnlock forKey:(id)kSecAttrAccessible];

Я не знаю, почему ошибка возникает снова и снова.


person OreonHard    schedule 29.10.2020    source источник
comment
Вам нужно преобразовать строку в данные, когда вы ее устанавливаете.   -  person skaak    schedule 02.11.2020


Ответы (1)


ИЗМЕНИТЬ

Хорошо, давайте попробуем еще раз. Библиотека-оболочка, которую вы используете, предназначена специально для одного объекта, поэтому кажется, что она дает сбой при добавлении атрибутов цепочки для ключей. Тем не менее, кажется, что это работает, если вы сделаете это первым. Итак, сначала загрузите конфигурацию, а затем данные элемента, как показано ниже, и все должно работать.

    KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"UserData"
                                       accessGroup:@"49YVVGB32W.com.covimdm.daelim.pushData"];

    NSString * pushString = @"Some string";
    NSData   * pushData   = [pushString dataUsingEncoding:NSUTF8StringEncoding];

    [wrapper setObject:kSecAttrAccessibleAfterFirstUnlock
            forKey:kSecAttrAccessible]; // Do configuration first
    [wrapper setObject:pushString // Must be string!?
            forKey:kSecValueData];

Приведенный выше код работает на этой стороне, хотя и с KeychainItemWrapper из здесь. Из источника кажется, что элемент записывается каждый раз, когда вы устанавливаете объект, поэтому я думаю, что вам сначала нужна конфигурация.

Кроме того, это НЕ работало, если я сохранял данные, как я предлагал ранее. Кажется, вам нужно сохранить строку. Приведенный выше код отлично работал с этой стороны, надеюсь, он сделает то же самое и для вас.

person skaak    schedule 02.11.2020
comment
Спасибо за ваш ответ. но моя проблема возникает при изменении значения kSecAttrAccessible на kSecAttrAccessibleAfterFirstUnlock. Я смотрел на эту проблему сегодня. И OSStatus возвращает код ошибки -50. Можно ли ответить на эту проблему? - person OreonHard; 02.11.2020
comment
Извините, я вас неправильно понял - глядя на это, немного хожу по кругу ... обновлю позже - person skaak; 02.11.2020
comment
О... Я проверяю ваш комментарий прямо перед этим. Буду ждать вашего ответа ;) - person OreonHard; 02.11.2020
comment
Я быстро посмотрел на это - я думаю, вам нужно сделать то, что я предлагаю, так как вам нужны данные для ключа kSecValueData ... остальные выглядят нормально, поэтому я не думаю, что это все. Кроме того, этот код -50 означает, что что-то незаконно при сохранении, поэтому я говорю это. - person skaak; 02.11.2020
comment
Хм, ладно, я просто сделаю то, что ты мне предлагаешь. - person OreonHard; 02.11.2020
comment
К сожалению, ошибка не устранена. Тем не менее, спасибо за ваш ответ. - person OreonHard; 02.11.2020
comment
Я думаю, теперь это должно работать - пожалуйста, проверьте еще раз. Также я упоминаю KeychainItemWrapper в ответе - убедитесь, что вы используете тот же самый. - person skaak; 02.11.2020
comment
Прошу прощения за поздний ответ. Я очищаю эту проблему, и я получил подсказку из того, что вы сказали. В моей цепочке ключей уже сохранено значение kSecAttrAccessible. Поэтому я сбрасываю свою связку ключей при запуске приложения. И сохраненные данные и kSecAttrAccessible при пустой связке ключей работают! Я предполагаю, что если разрешения ниже, чем kSecAttrAccessible, который вы пытаетесь обновить, он, похоже, не обновляется. - person OreonHard; 17.11.2020