Программно определить, включен ли пароль 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", что не совсем то, что я хочу, но может работать "после факта".

3 ответа

Решение

Обновить

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

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


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

Как это устроено

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

В документации говорится следующее:

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

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

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

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

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

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

Другие вопросы по тегам