【问题标题】:Programmatically detect whether iOS passcode is enabled or not以编程方式检测是否启用了 iOS 密码
【发布时间】:2014-02-15 17:39:39
【问题描述】:

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

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" 这不是我想要的,但可能会在“事后”工作。

【问题讨论】:

  • 没有任何改变。还是做不到。
  • 别担心。为用户提供在您的应用中设置密码的选项。让用户决定是否要使用它,无论用户是否拥有设备级密码。
  • 不会UIApplication.protectedDataAvailable 给你你想要的吗? developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/…
  • 对我来说,如果我没有设置密码,这是正确的,如果我有密码,也是如此。

标签: ios screen-lock parental-control


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    更新

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

    如果您仍需要以 iOS 8 为目标,请继续阅读 :)


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

    工作原理

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

    文档说明如下:

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

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

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

    【讨论】:

    • 在以前的版本上有办法吗?
    • @puntofisso 不幸的是没有
    • @Federico 没有测试它所以我不知道......显然它在扩展中不起作用,但如果 iOS/watchOS API 相同,那么我不明白为什么不......如果实际的手表启用了密码而不是 iPhone,那就是这样。
    • 我认为它在IOS9上不起作用,启用后代码运行良好,但不知道时总是未知...
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 2012-09-19
      • 2012-08-03
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多