kSecAccessControlUserPresence не запускает FaceId при аутентификации

Я создаю Keypair с привязкой ACL, и я использовал kSecAccessControlUserPresence ключ, чтобы предположить, что он сначала запустит TouchID/FaceID, а если не зарегистрируется, то запросит пароль и его нормально работает на iPhone6Plus, но на моем iPhoneX запрос пароля, даже если я зарегистрировал свое лицо на FaceID. Итак, я следую за вопросами.

  • kSecAccessControlUserPresence говорит, что сначала он запросит по биометрике (TouchId/FaceId), и если он не зарегистрирован, а затем запросит пароль, верно ли это понимание?
  • Если мое вышеупомянутое понимание неверно, то как я могу сначала выбрать биометрическую метрику, а затем ввести пароль?

Здесь следующий мой код.

private func generateHardwareKeyPairEC(keypairAttributes : KeyPairAttributes, completionHandler: @escaping (OSStatus?) -> Void ) {
// Access Control List

let accessControl: SecAccessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, [SecAccessControlCreateFlags.privateKeyUsage, SecAccessControlCreateFlags.userPresence], nil)!

// Public Key parameters
let publicKeyParams: [String: Any] = [
  kSecAttrLabel as String: keypairAttributes.keyLabel!,
  kSecAttrApplicationTag as String : keypairAttributes.keyApplicationTag!
  ]

// Private Key parameters
let privateKeyParams: [String: Any] = [
  kSecAttrLabel as String: keypairAttributes.keyLabel!,
  kSecAttrApplicationTag as String : keypairAttributes.keyApplicationTag!,
  kSecAttrIsPermanent as String: true,
  kSecAttrAccessControl as String: accessControl,
  ]

//Key Pair parameters
let params: [String: Any] = [
  kSecAttrKeyType as String: kSecAttrKeyTypeEC,//key type will be used here
  kSecAttrKeySizeInBits as String: keypairAttributes.keySize!,
  kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
  kSecPublicKeyAttrs as String : publicKeyParams,
  kSecPrivateKeyAttrs as String: privateKeyParams
]

//var publicKey, privateKey: SecKey?
DispatchQueue.global(qos: .default).async { // 1
  let status = SecKeyGeneratePair(params as CFDictionary, &self.publicKey, &self.privateKey)

  if status == noErr {
    print("Private key: \(String(describing: self.privateKey))\nPublic key: \(String(describing: self.publicKey))")
    print("Private key: \(String(describing: self.privateKey))\nPublic key: \(String(describing: self.publicKey))")
    completionHandler(status)
  } else {
    print("Failed to generate key pairs")
    completionHandler(status)
  }

    }
  }

0 ответов

У меня была эта проблема, я забыл добавить ключ описания использования Face ID в Info.plist.

В любом проекте, который использует биометрию, включите ключ NSFaceIDUsageDescription в файл Info.plist вашего приложения. Без этого ключа система не позволит вашему приложению использовать Face ID.

https://developer.apple.com/documentation/localauthentication/accessing_keychain_items_with_face_id_or_touch_id

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