更新: iOS 6では、iOSプロビジョニングプロファイルのアプリIDで構成する必要のある資格を使用して、アプリケーションのデータ保護を要求できると思われます。私はまだこれをテストしていません、そしてこれは私がそれで見つけることができる最高の情報です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
データ保護が有効になっているかどうかに関係なく、吐き出します。
ファイル保護が期待どおりに機能しているかどうかを確認するために使用できる方法は2つあります。残念ながら、これらの方法はどちらも、現場のデバイスでデータ保護が有効になっているかどうかを検出するのには適していません。
どちらの方法も、デバイスがロックされていると保護されたファイルを読み取ることができないという考えに基づいて機能します。
方法1では、タイマーを使用して、デバイスがロックされた後、アプリケーションの実行中にファイルの読み取りを試みます。
[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"}
データ保護が有効なデバイスがロックされた後も保護されたデータが引き続き利用できる10秒程度の猶予期間があるため、20秒の遅延が必要です。
2番目の方法は、アプリケーションで保護されたファイルを作成し、アプリケーションを終了し、デバイスをロックし、10秒間待ってから、XCodeオーガナイザーを使用してアプリケーションのコンテンツをダウンロードすることです。これによりエラーメッセージが表示され、保護されたファイルは空になります。
上記のテストのいずれかが説明どおりに動作しない場合は、データ保護が有効になっていないか、ファイル保護コードが正しく実装されていません。
機密情報をディスクに書き込む前に、アプリケーション内でデータ保護が有効になっていることを確認する方法が見つからなかったため、データ保護を有効にする必要があるとしてアプリケーションをマークできるように、Appleに機能拡張リクエストを提出しました。 。(rdar://10167256)
Appleは、モバイルデバイス管理(MDM)APIを介してこれに対するソリューションを提供しています。これは、サードパーティのサーバーと組み合わせて、デバイスでデータ保護を有効にする必要があるポリシーを適用できます。