我正在开发一个iOS应用程序,允许用户使用TouchID登录应用程序,但首先他们必须在应用程序内设置密码。问题是,为了显示设置密码选项以启用TouchID登录,我需要检测iOS设备是否支持TouchID。
使用LAContext和canEvaluatePolicy(就像这里的答案所示If Device Supports Touch ID),我能够确定当前设备是否支持TouchID如果用户在其iOS设备上设置了密码。这是我的代码片段(我正在使用Xamarin,因此它是C#):
static bool DeviceSupportsTouchID ()
{
if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
{
var context = new LAContext();
NSError authError;
bool touchIDSetOnDevice = context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out authError);
return (touchIDSetOnDevice || (LAStatus) Convert.ToInt16(authError.Code) != LAStatus.TouchIDNotAvailable);
}
return false;
}
如果用户未设置设备密码,则无论设备是否实际支持TouchID,authError都将返回"PasscodeNotSet"错误。如果用户的设备支持TouchID,则我希望在我的应用程序中始终显示TouchID选项,而不管用户是否在其设备上设置了密码(我只会警告用户首先在其设备上设置密码)。反之亦然,如果用户的设备不支持TouchID,则我显然不想在我的应用程序中显示TouchID选项。
我的问题是,是否有一种好方法可以始终确定iOS设备是否支持TouchID,而不考虑用户是否在其设备上设置了密码?
我能想到的唯一解决方法是确定设备的体系结构(已在Determine if iOS device is 32- or 64-bit中回答),因为TouchID仅支持64位体系结构的设备。但是,我正在寻找是否有更好的方法来完成此操作。