2015-01-13 1 views
4

Я хотел бы узнать, заблокировано ли устройство, когда я загружаю виджет «Уведомление/Сегодня», поэтому я могу правильно показать виджет. (Это финансовый, и мы не хотим, чтобы показать остатки на заблокированном телефоне)Выяснение, заблокировано ли устройство, из виджета уведомлений

на устройствах с TouchID, я могу попытаться получить доступ к брелок, и если я получаю

errSecInteractionNotAllowed

назад , Заперто. Все хорошо. Это не работает на устройствах без touchID (но с PIN-кодом). Я нашел несколько вещей, которые рекомендуем использовать

[[UIApplication sharedApplication] protectedDataAvailable]

Однако я не [UIApplication sharedApplication] в виджете.

Любые идеи, где и как это сделать? Мне просто нужно «да/нет»: устройство заблокировано.

Благодаря

[UPDATE: вот код у меня есть]

Получение файла:

+ (NSString *)lockedDeviceFilename { 
    NSURL *directoryUrl = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:USER_DEFAULTS_GROUP_NAME]; 
    return [directoryUrl.path stringByAppendingPathComponent:@"security.dummy"]; 
} 

Запись/создания файла (в приложении, а не расширение:

NSError *error = nil; 

NSString *documentPath = [FOOStorageGatekeeper lockedDeviceFilename]; 

[[NSFileManager defaultManager] removeItemAtPath:documentPath error:&error]; 

BOOL created = [[NSFileManager defaultManager] createFileAtPath:documentPath 
                 contents:[@"super secret file contents. we only care about the permissions" dataUsingEncoding:NSUTF8StringEncoding] 
                attributes:@{NSFileProtectionKey : NSFileProtectionComplete}]; 

Чтение:

BOOL isReadable = [[NSFileManager defaultManager] fileExistsAtPath:[FOOStorageGatekeeper lockedDeviceFilename]]; 

    NSLog(@"isReadable? %@", isReadable ? @"YES" : @"NO"); 

Он всегда может читать файл даже на устройстве TouchID с заблокированным экраном. Если я смотрю на атрибутах, он показывает NSFileProtectionKey установлено в NSFileProtectionComplete ... но я все еще могу ПРОЧТИТЕ ЭТО :(

Update: нашла Опеку ответа Яны как правильный

+0

Проверка наличия файла - это не то же самое, что проверка его читаемости. –

ответ

7

Создайте файл с NSFileProtectionComplete времени. ваше приложение работает, а затем попытаться получить к нему доступ с вашего расширения Если вы не можете получить доступ к нему, экран заблокирован

[[NSFileManager defaultManager] createFileAtPath:someFilePath 
             contents:[@"Lock screen test." dataUsingEncoding:NSUTF8StringEncoding] 
             attributes:@{NSFileProtectionKey: NSFileProtectionComplete}]; 

EDIT:.. Заключительные шаги включали завершить решение и консолидировать ответы (Оставшийся. работы, предоставленные Nic Wise.)

NSData *data = [NSData dataWithContentsOfURL:[FOOStorageGatekeeper lockedDeviceUrl] options: NSDataReadingMappedIfSafe error:&error]; 

if (error != nil && error.code == 257) { 
    NSLog(@"**** the keychain appears to be locked, using the file method"); 
    return YES; 
} 

Другой метод, используя errSecInteractionNotAllowed, также работает, но только для устройств TouchID.

Я нашел ответ (косвенно) here (Рего с Dev программы IOS, скорее всего необходимого)

+0

Thanks Ian - Я пробовал это, но я создавал его из Extension. Я попробую еще раз из приложения. Спасибо –

+0

Отметив ответ Яна как правильный, так как он был главным образом там - см. Мой собственный ответ о том, как его прочитать (вам нужны оба, obv) –

+1

Я обновил ответ, чтобы включить вашу работу, чтобы все было в одном месте. –

2

Наконец, через 3-4 дня смотрящих, нашел ответ. Это было больше в том, как я читал результат назад. Ян прав: мне нужно создать файл с помощью createFileAtPath, но затем прочитать его обратно, используя

NSData *data = [NSData dataWithContentsOfURL:[FOOStorageGatekeeper lockedDeviceUrl] options: NSDataReadingMappedIfSafe error:&error]; 

if (error != nil && error.code == 257) { 
    NSLog(@"**** the keychain appears to be locked, using the file method"); 
    return YES; 
} 

Другой метод, использующий errSecInteractionNotAllowed также работает, но только для устройств TouchID.

Я нашел ответ (косвенно) here (Рего с программой Dev IOS, скорее всего, нужно)

1

Я попробовал, что и мой файл был всегда читаемыми (в заблокированном экране или нет).

Я нашел этот документ: https://www.apple.com/business/docs/iOS_Security_Guide.pdf

Оказалось, что файлы заблокированы через 10 секунд после того, как устройство заблокировано.

Зная, что вы можете создавать файлы из расширений, и, похоже, это работает.