不是直接在我的应用中构建密码,而是可能要求用户输入密码两次(一次为设备输入,另一次为我的应用);我以为我可能会聪明地做自己并做一些事情:
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”这不是我想要的,但可能在事后“工作”。
答案 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。
然而,这是一种黑客行为,而不是设计行为,并且有一些不会发现的角落情况。我建议将此功能明确地置于用户的控制之下,而不是通过启发式启用的功能。