Обновление: В 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 запрос на расширение возможностей, чтобы пометить приложение как требующее защиты данных. быть включенным. (Rdar: // 10167256)
Apple предлагает решение для этого через свои API-интерфейсы управления мобильными устройствами (MDM), которые в сочетании со сторонним сервером могут использоваться для реализации политик, требующих включения защиты данных на устройствах.