如何检查用户设备是否使用 fingerprint/face 作为解锁方法。 [ReactNative] [世博会]

How to check if a user device is using fingerprint/face as unlock method. [ReactNative] [Expo]

我正在使用基于 Expo Toolkit 的 ReactNative 开发应用程序,我想知道如何检查用户是否正在使用指纹(iPhone 上的 TouchID)或面部检测([= 上的 FaceID) 21=] X>) 解锁设备。

我已经知道如何使用 Expo SDK 检查设备是否具有所需的硬件,如下所示:

let hasFPSupport = await Expo.Fingerprint.hasHardwareAsync();

但我需要检查用户是否在您的设备上选择 fingerprint/face 作为解锁方法,而不是图案或密码。

谢谢

我们可以检查设备是否已扫描指纹:

await Expo.Fingerprint.isEnrolledAsync()

因此,这可用于达到 objective,如下所示:

let hasFPSupport = await Expo.Fingerprint.hasHardwareAsync() && await Expo.Fingerprint.isEnrolledAsync();

目前,您可以通过检查 Expo.Fingerprint.hasHardwareAsync()Expo.Fingerprint.isEnrolledAsync() 来确定用户是否拥有面容 ID,然后使用 Expo.Constants.platform 检查他们是否拥有 iPhone X (docs here).

所以:

const hasHardwareSupport = await Expo.Fingerprint.hasHardwareAsync() && await Expo.Fingerprint.isEnrolledAsync();`
if (hasHardwareSupport) {
  const hasFaceIDSupport = Expo.Constants.platform.ios && Expo.Constants.platform.ios.model === 'iPhone X';
  const hasTouchIDSupport = !hasFaceIDSupport;
}

这是对 Donald 的回答的更新,其中考虑了新 iPhone XS 型号名称的 Expo 空字符串。它还考虑了模拟器。

const hasHardwareSupport =
  (await Expo.LocalAuthentication.hasHardwareAsync()) &&
  (await Expo.LocalAuthentication.isEnrolledAsync());

let hasTouchIDSupport
let hasFaceIDSupport

if (hasHardwareSupport) {
  if (Constants.platform.ios) {
    if (
      Constants.platform.ios.model === '' ||
      Constants.platform.ios.model.includes('X')
    ) {
      hasFaceIDSupport = true;
    } else {
      if (
        Constants.platform.ios.model === 'Simulator' &&
        Constants.deviceName.includes('X')
      ) {
        hasFaceIDSupport = true;
      }
    }
  }
   hasTouchIDSupport = !hasFaceIDSupport;
}

编辑:Expo 发布了修复空白模型字符串的更新。但是,您可能需要检查一下,以防下一个 iPhone 发布周期导致同样的问题。

如果您尝试了上述答案但它不起作用,请注意在我的post expo 文档发生时已更改

- import * as LocalAuthentication from 'expo-local-authentication';
- let compatible = await LocalAuthentication.hasHardwareAsync()