デバイスのパスコードおよびtouchId設定で構成されている設定に関係なく、LAContextは常にnoneを返します。例外ではなく、警告を投げているだけです。
提案されているように、iOS11.1ベータ版のXCode 9.1ベータ版でのみ動作します:(
私は問題を理解しました! canEvaluatePolicy
を正しく設定するには、biometryType
を呼び出す必要があります。
例:
func isFaceIdSupported() -> Bool {
if #available(iOS 11.0, *){
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
return context.biometryType == LABiometryType.typeFaceID
}
}
return false
}
Apple docs biometryTypeの場合:
「このプロパティは、生体認証ポリシーのcanEvaluatePolicy(_:error :)が成功した場合にのみ設定されます。デフォルト値はnoneです。」
ここで同じ問題を取得し、次のコードで修正しました。ただし、Xcode 9.1 Beta(およびシミュレーターのiOS 11.1 beta)でのみ機能します。
if (laContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil)) {
if #available(iOS 11.0, *) {
if (laContext.biometryType == LABiometryType.faceID) {
print("FaceId support")
} else if (laContext.biometryType == LABiometryType.touchID) {
print("TouchId support")
} else {
print("No Biometric support")
}
} else {
// Fallback on earlier versions
}
}
@Ermishのコードを使用する場合、デバイスに登録済みの顔がない場合、isFaceIdSupported()はfalseを返します。 iOS SDK 11.1での最新のテストによると、laContext.canEvaluatePolicy関数を呼び出して結果を気にせずに、laContext.biometryTypeの内容を確認するだけです。
登録された顔がない場合、canEvaluatePolicyは失敗しますが、デバイスはFace IDをサポートします。
Xamarin.iOSでは、次の前にポリシーを評価する必要があります。
NSError error;
bool success = context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error);
if (context.BiometryType == LABiometryType.TouchId)
{
//Do Something
}