Результаты SecKeychainCopySearchList никогда не видят динамических изменений цепочки для ключей после первого выполнения - почему? - PullRequest
0 голосов
/ 11 января 2019

Я довольно новичок в Swift и пытаюсь написать небольшое приложение с меню, которое автоматически примет действие при вставке смарт-карты в мою систему. В идеале я хотел бы использовать API цепочки для ключей, так как первое, что я хочу сделать с цепочкой для ключей, это активировать разблокировку. Однако у меня возникла проблема: хотя я могу вызвать SecKeychainAddCallback, чтобы получать уведомления в любое время, когда происходит изменение цепочки ключей, и могу вызвать SecKeychainCopySearchList, чтобы найти список цепочек для ключей, результаты SecKeychainCopySearchList никогда не меняются после первого выполнения (это также верно для SecKeychainCopyDomainSearchList, ограниченного динамическими цепочками ключей).

Действительно странная вещь заключается в том, что это происходит только с динамическими цепочками для ключей - если я добавляю или удаляю обычную цепочку для ключей, это работает.

Вот пример кода, который запускается, когда приложение начинает регистрировать обработчик:

func applicationDidFinishLaunching(_ aNotification: Notification) {
    SecKeychainAddCallback({(event, callbackInfo, pointer) -> OSStatus in
        var cfKeychains: CFArray!
        SecKeychainCopySearchList(&cfKeychains)
        print("Found", CFArrayGetCount(cfKeychains), "keychains.")
        return 0
    }, SecKeychainEventMask.keychainListChangedMask, nil)
}

Когда приложение запускается, я могу вставить свою смарт-карту и посмотреть, как распечатываются документы. Я, кажется, получаю около дюжины звонков за вставку или удаление, что странно, но я могу с этим справиться. Однако проблема заключается в следующем:

Начните с того, что смарт-карта отсутствует в системе, и запустите приложение. Keychain Access показывает 3 цепочки для ключей. Вставьте смарт-карту. "Найдено 4 брелка." печатается около десятка раз, что ожидается, потому что событие запускается несколько раз.

Теперь удалите смарт-карту, и появляется проблема - сообщение печатается еще дюжину раз, но счет остается равным 4, хотя в доступе цепочки для ключей есть только 3 записи. Это работает и по-другому - если вы запустите программу с вставленной картой, после удаления она скажет 3 цепочки для ключей, и будет продолжать говорить 3 навсегда (или, по крайней мере, пока я не выйду и не перезапущу программу).

Спасибо, что взглянули на это!

...