Программно определить, включен ли код доступа 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 для шифрования диска. Подробнее см. Защита данных с помощью шифрования на диске.
Однако это хак, а не поведение, и есть некоторые угловые случаи, о которых он не будет знать. Я бы рекомендовал сделать эту функцию тем, что явно под контролем пользователя, а не с помощью эвристики.