Подтвердить что ты не робот

Программно проверить, установлен ли блокировка пароля

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

В 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
}

Ответ 3

Так как 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;
}

Ответ 4

Решение Xamarin.iOS для iOS 8... note Я вызываю 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;
}