Программно определить, включен ли код доступа iOS или нет

Вместо того, чтобы создавать код доступа непосредственно в моем приложении и потенциально требовать от пользователя ввода пароля дважды (один раз для устройства и снова для моего приложения); Я подумал, что я могу сообразить и сделать что-то вроде:

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 в комплекте настроек", или это может быть ответ; "Блокировать события блокировки iphone", который не совсем то, что я хочу, но может работать "после факта".

Ответ 1

Update

Как и в iOS 9, вы можете достичь этого, используя LocalAuthentication.framework. Если таргетинг на iOS 9+ читайте комментарии здесь или посмотрите этот ответ.

Если вам все еще нужно настроить таргетинг на iOS 8, продолжайте читать:)


Начиная с iOS8, вы можете!
Я собрал простую категорию, чтобы легко проверить статус: https://github.com/liamnichols/UIDevice-PasscodeStatus

Как это работает

Эта категория работает с использованием новых функций accessControl, добавленных в Security.Framework в iOS 8. Он пытается добавить элемент в цепочку ключей, используя уровень защиты kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly.

В документации указано следующее:

Данные элемента могут быть доступны только при разблокировке устройства. Этот класс только          если код пароля установлен на устройстве. Это рекомендуется для          элементы, которые должны быть доступны только в том случае, если приложение находится в          на переднем плане. Элементы с этим атрибутом никогда не будут мигрировать к новому          устройства, поэтому после восстановления резервной копии на новом устройстве эти элементы          будет отсутствовать. Элементы не могут быть сохранены в этом классе на устройствах          без кода доступа. Отключение кода доступа к устройству приведет к          элементы этого класса должны быть удалены.

Из-за этого появляется ошибка при попытке добавить или прочитать элемент в цепочке ключей с этим уровнем accessControl. Если мы увидим эту ошибку, passcodeStatus возвращается как LNPasscodeStatusDisabled. Если мы сможем успешно прочитать или записать в цепочку ключей с этим уровнем accessControl, то мы возвращаем LNPasscodeStatusEnabled.

Если устройство не поддерживается или возвращается не связанная ошибка с ключом, мы возвращаем LNPasscodeStatusUnknown.

Ответ 2

Для 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)
  }

Ответ 3

Я не знаю, как получить эту информацию напрямую, но я думаю, что вы, вероятно, сможете достичь результата, который вы используете, используя побочные эффекты поддержки Apple для шифрования диска. Подробнее см. Защита данных с помощью шифрования на диске.

Однако это хак, а не поведение, и есть некоторые угловые случаи, о которых он не будет знать. Я бы рекомендовал сделать эту функцию тем, что явно под контролем пользователя, а не с помощью эвристики.