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

时间:2014-01-24 16:25:32

标签: ios screen-lock parental-control

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

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

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

BOOL notReally = [UIDevice isUserSlightlyMoreSecureBecauseTheySetDeviceLockOn];

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

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

我猜不是基于这个问题(但是几岁)“programmatically check for iPhone's Passcode in settings bundle”或者这可能是答案; “Lock Unlock events iphone”这不是我想要的,但可能在事后“工作”。

3 个答案:

答案 0 :(得分:27)

对于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)
  }

答案 1 :(得分:25)

更新

从iOS 9开始,您可以使用LocalAuthentication.framework实现此目的。如果定位iOS 9+,请阅读评论here或查看this answer

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


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

如何运作

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

文档说明如下:

  

只有在设备解锁时才能访问项目数据。这门课只是            如果设备上设置了密码,则可用。这是推荐的            应用程序所在的项目只需要访问的项目            前景。具有此属性的项目永远不会迁移到新项目            设备,因此备份恢复到新设备后,这些项目            将失踪。 此类中的任何项都不能存储在设备上            没有密码。禁用设备密码会导致所有问题            要删除此课程中的项目。

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

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

答案 2 :(得分:1)

我不知道有任何直接获取此信息的方法,但我认为您可以通过使用Apple支持磁盘加密的副作用来实现您所获得的结果。有关详细信息,请参阅Protecting Data Using On-Disk Encryption

然而,这是一种黑客行为,而不是设计行为,并且有一些不会发现的角落情况。我建议将此功能明确地置于用户的控制之下,而不是通过启发式启用的功能。