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

Eri*_*ric 20 parental-control ios screen-lock

而不是直接在我的应用程序中构建密码,并可能要求用户输入密码两次(一次为设备,另一次为我的应用程序); 我以为我可能会聪明地做自己并做一些事情:

if (device has passcode)
    continue into my app
else
    make user enter my app passcode
Run Code Online (Sandbox Code Playgroud)

我不想设置设备密码,我不想强​​制屏幕锁定,不加密任何东西 - 我真正想要的只是一个API来检测设备密码是否生效.就像是:

BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn];
Run Code Online (Sandbox Code Playgroud)

或者如果我感到幸运的话:

BOOL isPasscodeEnabled = [UIDevice isPasscodeEnabled];
BOOL isSimplePasscode = [UIDevice isSimplePasscode];
NSInteger minutes = [UIDevice requirePasscodeAfter];
Run Code Online (Sandbox Code Playgroud)

我猜不是基于这个问题(但是已经有几年了)"以编程方式检查设置包中的iPhone密码 "或者这可能就是答案; " 锁定解锁事件iphone "这不是我想要的,但可能"事后".

ssc*_*ale 31

对于iOS 9+,您可以使用新LocalAuthentication类检测它,它可以在Simulator和设备上运行:

import LocalAuthentication

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


lia*_*ols 26

更新

从iOS 9开始,您可以使用LocalAuthentication.framework.如果定位iOS 9+,请阅读此处的评论或查看此答案.

如果您仍需要定位iOS 8,请继续阅读:)


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

这个怎么运作

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

文档说明如下:

只有在设备解锁时才能访问项目数据.仅当设备上设置了密码时,此类才可用.对于仅在应用程序位于前台时需要访问的项目,建议使用此选项.具有此属性的项目永远不会迁移到新设备,因此在将备份还原到新设备后,这些项目将会丢失.在没有密码的设备上,此类中不能存储任何项目.禁用设备密码将导致删除此类中的所有项目.

因此,当您尝试使用此级别的accessControl添加或读取钥匙串中的项目时,将返回错误.如果我们看到此错误,则passcodeStatus返回为LNPasscodeStatusDisabled.如果我们能够使用此级别的accessControl成功读取或写入钥匙串,那么我们将返回LNPasscodeStatusEnabled.

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