Программно проверить, установлен ли блокировка пароля
Поскольку мое приложение будет иметь дело с конфиденциальными данными пользователя, я хотел бы знать, есть ли способ, который я могу проверить в своем приложении, есть ли в IOS блокировка паролей.
Я должен проверить это, потому что скажите, есть ли у пользователя в приложении какая-то информация, а затем держит его на столе и гаснет на пару минут. IPad/iPhone по умолчанию переходит в режим ожидания. Если была установлена блокировка паролей, только когда введен правильный пароль, кто-нибудь сможет использовать ipad. Это обеспечит дополнительную меру безопасности, чтобы предотвратить проникновение любого прохожего конфиденциальных данных из приложения.
Итак, в основном, я хотел бы, чтобы мое приложение проверяло, установлена ли блокировка пароля, и если не предложите пользователю сделать это.
Возможно ли это?
Ответы
Ответ 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;
}