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

Я довольно новичок в 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 навсегда (или, по крайней мере, пока я не выйду и не перезапущу программу).

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

0 ответов

Другие вопросы по тегам