iOS Доступ к цепочке ключей в фоновом потоке и сбой приложения - PullRequest
0 голосов
/ 20 апреля 2020

Я пишу тестовое приложение, которое включает в себя "тяжелый" доступ к цепочке для ключей с добавлением и удалением элементов цепочки для ключей с различными атрибутами управления доступом и разными типами элементов.

Это приложение очень простое - имеет текстовую область, которая служит журналом того, что пишется и удаляется; кнопка, которая запускает запуск тестов. Приложение имеет только 1 класс ViewController, который имеет метод IBAction для кнопки. Этот метод содержит весь код, который считывает / удаляет элементы цепочки для ключей.

Моя проблема в том, что приложение отлично работает, если оно запускается из XCode - при нажатии кнопки я получаю подсказки цепочки для ключей для TouchID, и все выглядит хорошо. Но, как только я запускаю приложение из Springboard и нажимаю кнопку, я получаю подсказку цепочки для ключей, но приложение вылетает через несколько секунд. Изучение журналов показывает, что причина заключается в «нарушении сторожевого режима обновления сцены: исчерпано разрешение в реальном времени 10,00 с».

Что я делаю не так и чем отличается запуск из XCode от пользователя, запускающего его?

Очевидно, я не опытный разработчик и хотел бы получить справку / указатели в правильном направлении.

Отредактировано для добавления кода: есть только для valet.set() или seceureValet.set().

@IBAction func keychainItemsTest() {
 log.text += "Starting read/write..."
 valet.removeAllObjects()
 secureValet.removeAllObjects()

 log.text += "Adding value test1 to keychain"
 valet.set(string:"test1", forKey:"test1")
 ...
}

1 Ответ

1 голос
/ 20 апреля 2020

Ваше приложение убивают, потому что оно слишком долго не отвечало. Приложения, запущенные из Xcode (с подключенным отладчиком), освобождаются от тайм-аутов сторожевого таймера на реальном оборудовании.

Без какого-либо кода сложно дать вам конкретную обратную связь, но я предполагаю, что вы пытаетесь получить доступ к цепочке ключей заблокируйте приложение в главном потоке, прежде чем оно станет доступным.

Дождитесь вызова метода делегата applicationProtectedDataDidBecomeAvailable, прежде чем обращаться к цепочке ключей. Вызовы в цепочку для ключей являются поточно-ориентированными в iOS, поэтому вы также должны иметь возможность выполнять вызовы для API цепочки для ключей из основного потока, чтобы избежать любых блокирующих запросов из-за блокировки вашего пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...