以编程方式检测是否启用iOS密码

而不是直接在我的应用程序中build立密码,并可能要求用户input密码两次(一次为设备,一次为我的应用程序); 我以为自己可能会聪明一些,并按照以下的方式做一些事情:

if (device has passcode) continue into my app else make user enter my app passcode 

我不想设置设备密码,我不想强​​制屏幕locking,不encryption任何东西 – 我真正想要的只是一个API来检测设备密码是否有效。 就像是:

 BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn]; 

或者如果我感觉幸运的话

 BOOL isPasscodeEnabled = [UIDevice isPasscodeEnabled]; BOOL isSimplePasscode = [UIDevice isSimplePasscode]; NSInteger minutes = [UIDevice requirePasscodeAfter]; 

我猜不是基于这个问题(但是几年前)“ 编程检查iPhone的密码设置中的密码 ”或这可能是答案; “ 锁解锁事件iPhone ”这不正是我想要的,但可能“事后”的工作。

更新

从iOS 9开始,您可以使用LocalAuthentication.framework来实现这LocalAuthentication.framework 。 如果针对iOS 9+阅读这里的评论或看看这个答案 。

如果你仍然需要瞄准iOS 8然后继续阅读:)


从iOS8开始,你可以!
我已经放在一个简单的类别来轻松检查状态: https : //github.com/liamnichols/UIDevice-PasscodeStatus

怎么运行的

此类别通过使用添加到iOS 8中的Security.Framework的新accessControlfunction来工作。它尝试使用kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly保护级别将项目添加到钥匙串。

该文档声明如下:

项目数据只能在设备解锁时访问。 此类仅在设备上设置密码时才可用。 build议在应用程序处于前台时仅需要可访问的项目。 具有此属性的项目将永远不会迁移到新设备,因此备份恢复到新设备后,这些项目将会丢失。 没有密码的设备上没有任何项目可以存储在这个设备上。 禁用设备密码将导致此类中的所有项目被删除。

因此,当您尝试使用此级别的accessControl添加或读取钥匙串中的项目时,会返回错误。 如果我们看到这个错误, passcodeStatus返回为LNPasscodeStatusDisabled 。 如果我们可以用这个级别的accessControl成功地读或写钥匙链,那么我们返回LNPasscodeStatusEnabled

如果设备不被支持,或者返回了与钥匙串无关的错误,我们将返回LNPasscodeStatusUnknown

对于iOS 9+,您可以使用新的LocalAuthentication类来检测它,它可以在模拟器以及设备上使用:

 import LocalAuthentication private func devicePasscodeSet() -> Bool { //checks to see if devices (not apps) passcode has been set return LAContext().canEvaluatePolicy(.DeviceOwnerAuthentication, error: nil) } 

我不知道任何直接获取这些信息的方法,但是我认为,通过使用苹果公司对磁盘encryption的支持的副作用,你可能会获得后续的结果。 有关详细信息,请参阅使用磁盘encryption保护数据 。

然而,这是一个黑客行为,而不是devise的行为,并有一些它不会意识到的angular落案件。 我build议将这个特性明确地置于用户的控制之下,而不是启发式的启用。