29

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

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];

我猜不是基于这个问题(但已经有几年了)“以编程方式检查设置包中的 iPhone 密码”或者这可能是答案;“ Lock Unlock events iphone ” 这不是我想要的,但可能会在“事后”工作。

4

3 回答 3

45

对于 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)
  }
于 2016-04-19T04:47:21.723 回答
31

更新

从 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.

于 2014-09-18T13:04:41.827 回答
1

我不知道有任何直接获取此信息的方法,但是我认为您可以通过使用 Apple 支持磁盘加密的副作用来实现您想要的结果。有关详细信息,请参阅使用磁盘加密保护数据

然而,这是一种 hack 而不是设计的行为,并且有一些它不会意识到的极端情况。我建议将此功能设置为明确受用户控制的功能,而不是您通过启发式启用的功能。

于 2014-01-24T16:32:01.247 回答