如果在iOS 8上使用LAPolicyDeviceOwnerAuthentication,会发生什么?

如果在iOS 8上使用LAPolicyDeviceOwnerAuthentication,会发生什么?,ios,objective-c,touch-id,Ios,Objective C,Touch Id,在我的应用程序中,我想知道用户是否设置了密码或指纹(touchID)。有一个非常简单的方法:[LAContext CaneValuePolicy:LAPolicyDeviceOwnerAuthentication error:error] 但是,sayLAPolicyDeviceOwnerAuthentication仅在iOS9及更高版本上可用。我不想在没有解释的情况下让iOS 8用户崩溃,即使它正在变老。问题是,我在iOS8.4模拟器上试用过它,它似乎可以编译并正常工作 如果我在iOS 8上使

在我的应用程序中,我想知道用户是否设置了密码或指纹(touchID)。有一个非常简单的方法:
[LAContext CaneValuePolicy:LAPolicyDeviceOwnerAuthentication error:error]

但是,say
LAPolicyDeviceOwnerAuthentication
仅在iOS9及更高版本上可用。我不想在没有解释的情况下让iOS 8用户崩溃,即使它正在变老。问题是,我在iOS8.4模拟器上试用过它,它似乎可以编译并正常工作


如果我在iOS 8上使用
LAPolicyDeviceOwnerAuthentication
,会产生什么不良影响?

我使用的代码与此类似:

LAPolicy localAuthPolicy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
if (![[UIDevice currentDevice].systemVersion hasPrefix:@"8."]) {
    localAuthPolicy = LAPolicyDeviceOwnerAuthentication;
}
这确保我只在iOS 9及更高版本上使用
LAPolicyDeviceOwnerAuthentication

当您尝试使用
LAPolicyDeviceOwnerAuthentication
时,在iOS 8设备上实际发生的情况没有记录在案。任何东西都不太可能崩溃,但身份验证可能会因为未知值而返回NO,或者可能会成功,因为iOS 8只有一个有效值,并且可能不会执行任何检查


不幸的是,Objective-C不提供任何有效枚举值的运行时检查,就像您可以使用常量、方法和类一样。

如果您在iOS 9以下的任何设备上使用
LAPolicyDeviceOwnerAuthentication
,应用程序将崩溃。这就是我的应用程序发生的情况,当时我没有意识到这在iOS 9以下的任何版本上都不可用,但我的应用程序支持iOS 8.x作为其支持的最低OS版本。

很有意义,因为枚举值必须在某个头中定义,并且方法调用只将其视为未知枚举值。不过,奇怪的是:在编译时,xcode不针对不同版本的iOS的不同头进行编译吗?不,xcode只在基本SDK上编译。在编译时,枚举值只需替换为它们的整数值。因此,您只能将
1
2
作为策略传递。因此,真正未知的是,如果在iOS 8中只有
1
是已知的策略,那么在iOS 8下,如果将
2
作为策略传递,会发生什么情况。