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