Обновление: С iOS 6 возможно, что требуется защита данных для вашего приложения, используя право, которое должно быть настроено на идентификаторе приложения в профиле обеспечения iOS. Я не проверял это еще и это лучшая информация, которую я мог бы найти на него https://devforums.apple.com/message/707939#707939
Мои расследования этого дела приводят меня к мысли, что очень трудно определить, является ли защита данных включена на устройство.
защита файлов включена путем установки атрибута NSFileProtectionKey
файла NSFileProtectionComplete
Например, чтобы создать защищенный файл можно запускать код, как:
[[NSFileManager defaultManager] createFileAtPath:[self filePath]
contents:[@"super secret file contents" dataUsingEncoding:NSUTF8StringEncoding]
attributes:[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey]];
К сожалению, этот код будет выполняться без ошибок, даже если Защита данных не включена на устройстве (или если код запущен на симуляторе, где защита данных недоступна).
Хуже, атрибут NSFileProtectionComplete
будет установлен независимо от того, защищен ли файл или нет. Следующее:
self.fileProtectionValue = [[[NSFileManager defaultManager] attributesOfItemAtPath:[self filePath]
error:NULL] valueForKey:NSFileProtectionKey];
NSLog(@"file protection value: %@", self.fileProtectionValue);
будет выплюнуть file protection value: NSFileProtectionComplete
независимо от того, включена ли защита данных или нет.
Есть два метода, которые я смог использовать, чтобы обнаружить, работает ли защита файлов как ожидалось. К сожалению, ни один из этих методов не подходит для обнаружения, если защита данных включена на устройстве в поле.
Оба метода работают над тем, что защищенный файл не может быть прочитан, если устройство заблокировано.
Метод один включает в себя с помощью таймера, чтобы попытаться прочитать файл после того, как устройство заблокировано, но в то время как ваше приложение продолжает работать:
[self performSelector:@selector(doReload) withObject:nil afterDelay:20];
- (void)doReload {
NSLog(@"protected data available: %@",[[UIApplication sharedApplication] isProtectedDataAvailable] ? @"yes" : @"no");
NSError *error;
self.fileContents = [NSString stringWithContentsOfFile:[self filePath]
encoding:NSUTF8StringEncoding
error:&error];
NSLog(@"file contents: %@\nerror: %@", self.fileContents, error);
}
Если запустить приведенный выше код и заблокировать устройство защищенным данным его выплюнет:
protected data available: no
file contents: (null)
error: Error Domain=NSCocoaErrorDomain Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" UserInfo=0x16e110 {NSFilePath=/var/mobile/Applications/D71F1F1F-6C25-4848-BB1F-51539B47EC79/Documents/protected_file, NSUnderlyingError=0x16e010 "The operation couldn’t be completed. Operation not permitted"}
20-секундная задержка необходима, потому что есть 10 второй или так льготного периода, когда защищенные данные по-прежнему доступны после включен то защита данных устройство заблокировано.
Второй способ - создать защищенный файл в приложении, выйти из приложения, заблокировать устройство, подождать 10 секунд, а затем использовать организатор XCode для загрузки содержимого приложения. Это приведет к появлению сообщения об ошибке, и защищенный файл будет пустым.
Если какой-либо из вышеперечисленных тестов не работает должным образом, как описано, защита данных либо не включена, либо ваш код защиты файлов был неправильно реализован.
Поскольку я не нашел способа проверить в приложении, что защита данных включена до того, как я напишу конфиденциальную информацию на диск, я подал запрос об улучшении функции с Apple, чтобы иметь возможность отмечать приложение как требующее Data Защита должна быть включена. (rdar: // 10167256)
Apple предлагает это решение с помощью своих API-интерфейсов управления мобильными устройствами (MDM), которые в сочетании с сторонним сервером могут использоваться для обеспечения соблюдения политик, требующих включения защиты данных на устройствах ,
Мне было интересно то же самое - когда устройство заблокировано, я не могу добраться до файловой системы, чтобы узнать, зашифрованы ли файлы (а не действительно заинтересованы в джейлбрейке). –