Программная проверка, установлена ​​ли блокировка пароля - PullRequest
19 голосов
/ 31 мая 2011

Поскольку мое приложение будет обрабатывать конфиденциальные данные пользователя, я хотел бы узнать, можно ли из своего приложения проверить, есть ли в iOS установлен пароль для блокировки.

Причина, по которой я должен это проверить, заключается в том, что, если пользователь имеет в приложении некоторую информацию, а затем сохраняет ее на столе и выходит на пару минут. IPad / iPhone по умолчанию переходит в режим ожидания. Если бы была установлена ​​блокировка с помощью пароля, только когда введен правильный пароль, любой сможет использовать ipad. Это обеспечило бы дополнительную меру безопасности, чтобы предотвратить прохождение любого конфиденциального пользователя из приложения конфиденциальными данными.

В общем, я хотел бы, чтобы мое приложение проверяло, установлена ​​ли блокировка с помощью пароля, и если нет, запрашивает у пользователя это сделать.

Возможно ли это?

Ответы [ 4 ]

10 голосов
/ 15 сентября 2014

В iOS 8 теперь есть способ проверить, что у пользователя установлен пароль. Этот код будет зависать на iOS 7.

Objective-C:

-(BOOL) deviceHasPasscode {
    NSData* secret = [@"Device has passcode set?" dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *attributes = @{ (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService: @"LocalDeviceServices",  (__bridge id)kSecAttrAccount: @"NoAccount", (__bridge id)kSecValueData: secret, (__bridge id)kSecAttrAccessible: (__bridge id)kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly };

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL);
    if (status == errSecSuccess) { // item added okay, passcode has been set            
        SecItemDelete((__bridge CFDictionaryRef)attributes);

        return true;
    }

    return false;
}

Swift:

func deviceHasPasscode() -> Bool {
    let secret = "Device has passcode set?".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    let attributes = [kSecClass as String:kSecClassGenericPassword, kSecAttrService as String:"LocalDeviceServices", kSecAttrAccount as String:"NoAccount", kSecValueData as String:secret!, kSecAttrAccessible as String:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly]

    let status = SecItemAdd(attributes, nil)
    if status == 0 {
        SecItemDelete(attributes)
        return true
    }

    return false
}
6 голосов
/ 16 марта 2016

Начиная с iOS 9, в платформе LocalAuthentication есть флаг LAPolicyDeviceOwnerAuthentication.

+ (BOOL)isPasscodeEnabled
{
    NSError *error = nil;
    LAContext *context = [[LAContext alloc] init];

    BOOL passcodeEnabled = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];

    if(passcodeEnabled) {
        NSLog(@"Passcode enabled.");
        return YES;
    }

    NSLog(@"Passcode NOT enabled: %@", error.localizedDescription);
    return NO;
}

Начиная с iOS 8 был еще один флаг для проверки, включен ли TouchID:

+ (BOOL)isTouchIdEnabled
{
    NSError *error = nil;
    LAContext *context = [[LAContext alloc] init];

    BOOL touchIDEnabled = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];

    if(touchIDEnabled) {
        NSLog(@"TouchID enabled.");
        return YES;
    }

    NSLog(@"TouchID NOT enabled: %@", error.localizedDescription);
    return NO;
}
3 голосов
/ 01 июня 2011

Взгляните на раздел Защита файлов на Среда выполнения приложения .Для защиты файлов требуется, чтобы у пользователя была включена настройка блокировки пароля и установлен действительный пароль.Если ваше приложение пишет / создает и файл, используйте параметр NSDataWritingFileProtectionComplete .Если ваше приложение не использует никаких файлов, создайте фиктивный файл и включите защиту.

2 голосов
/ 22 октября 2014

Решение Xamarin.iOS для iOS 8 ... примечание Я звоню SecKeyChain.Remove(secRecord) на каждую проверкуЯ обнаружил, что если бы я не включил это, я мог перевести устройство в нечетное состояние, когда оно пыталось аутентифицироваться с пользователем при каждом вызове SecKeyChain.Add(secRecord)

private bool DetectIfPasscodeIsSet ()
{
    var secRecord = new SecRecord (SecKind.GenericPassword) {
        Label = "Check if passcode is set",
        Description = "Check if passcode is set",
        Account = "Check if passcode is set",
        Service = "Check if passcode is set",
        Comment = "Check if passcode is set",
        ValueData = NSData.FromString ("Check if passcode is set"),
        Generic = NSData.FromString ("Check if passcode is set")
    };
    SecKeyChain.Remove (secRecord); 
    secRecord.AccessControl = new SecAccessControl (SecAccessible.WhenPasscodeSetThisDeviceOnly);
    var status = SecKeyChain.Add (secRecord);
    if (SecStatusCode.Success == status) {
        SecKeyChain.Remove (secRecord);
        return true;
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...