1ce*_*1ce 16 iphone ios touch-id ios8 face-id
LAContext具有检查设备是否可以评估触摸ID并提供错误消息的方法.问题是系统在两种情况下给出了相同的错误消息"LAErrorPasscodeNotSet":
1)如果用户具有Touch ID,但在设置中将其关闭(带iOS8的iPhone 5s)
2)如果设备没有Touch ID(带iOS8的iPad)
问:如何检查设备是否支持Touch ID,但未在设置中打开?
更新:
已经创建了关于这个bug(ID#18364575)的Apple门票,并收到了回答:
" Engineering已根据以下信息确定此问题的行为符合预期:
如果未设置密码,您将无法检测Touch ID的存在.一旦设置了密码,canEvaluatePolicy将最终返回LAErrorTouchIDNotAvailable或LAErrorTouchIdNotEnrolled,您将能够检测Touch ID存在/状态.
如果用户在具有Touch ID的手机上禁用了密码,则他们知道他们将无法使用Touch ID,因此这些应用无需检测Touch ID状态或推广基于Touch ID的功能."
也许您可以编写自己的方法来检查您正在运行的设备,因为如果返回的错误相同,则很难确定是否支持Touch ID.我会用这样的东西:
int sysctlbyname(const char *, void *, size_t *, void *, size_t);
- (NSString *)getSysInfoByName:(char *)typeSpecifier
{
size_t size;
sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
free(answer);
return results;
}
- (NSString *)modelIdentifier
{
return [self getSysInfoByName:"hw.machine"];
}
Run Code Online (Sandbox Code Playgroud)
拥有模型标识符后,我只会检查模型标识符是否等于支持Touch ID的模型之一:
- (BOOL)hasTouchID
{
NSArray *touchIDModels = @[ @"iPhone6,1", @"iPhone6,2", @"iPhone7,1", @"iPhone7,2", @"iPad5,3", @"iPad5,4", @"iPad4,7", @"iPad4,8", @"iPad4,9" ];
NSString *model = [self modelIdentifier];
return [touchIDModels containsObject:model];
}
Run Code Online (Sandbox Code Playgroud)
该阵列包含支持Touch ID的所有型号ID,它们是:
此方法的唯一缺点是,一旦使用Touch ID发布新设备,模型阵列将不得不手动更新.
| 归档时间: |
|
| 查看次数: |
6634 次 |
| 最近记录: |