从 Watch 应用程序调用父应用程序时如何使用文件加密?

How can I use file encryption when calling parent application from Watch app?

我正在使用 openParentApplicationhandleWatchKitExtensionRequest 从 Apple Watch 应用程序调用我的 iPhone 上的父应用程序。在主应用程序中,我将 CoreData 与 addPersistentStoreWithType:

的以下选项一起使用
NSDictionary *options = @{
        NSMigratePersistentStoresAutomaticallyOption : @YES,    //
        NSInferMappingModelAutomaticallyOption : @YES,          //
        NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"}, //
        NSPersistentStoreFileProtectionKey : NSFileProtectionCompleteUnlessOpen
    };

这导致异常:

This NSPersistentStoreCoordinator has no persistent stores (device locked). It cannot perform a save operation.

这是否意味着我既不能使用 NSFileProtectionCompleteUnlessOpen 也不能使用 NSFileProtectionComplete

我必须使用 NSFileProtectionNone 还是 NSFileProtectionCompleteUntilFirstUserAuthentication

我想知道一种使用 NSFileProtectionCompleteUnlessOpen 来保护我的数据的方法,并且当我的 Watch 应用程序使用 openParentApplication 时仍然能够访问数据。

解决问题的可能方法(但不是真正的解决方案)

NSFileProtectionCompleteUntilFirstUserAuthentication 似乎是我推荐的方式。它确保自上次启动后用户必须至少解锁一次设备。

此问题是在 iOS 7 和后台刷新时引入的。这是为了防止物理取证分析读取您未加密的数据。


来自 https://security.stackexchange.com/questions/57588/iphone-ios-7-encryption-at-lock-screen 的其他信息:

  • NSFileProtectionNone:文件可以随时访问,即使设备被锁定;
  • NSFileProtectionComplete:只有在设备解锁时才能访问文件(请注意,设备锁定后有大约 10 秒的宽限期,在此期间文件仍然可以访问);
  • NSFileProtectionCompleteUnlessOpen: 设备锁定时可以创建文件,但关闭后,只能在设备解锁时访问;
  • NSFileProtectionCompleteUntilFirstUserAuthentication: 只有设备自启动后至少解锁过一次才能访问文件。

Gilt 的人在这里也对这种行为进行了很多解释:http://tech.gilt.com/post/67708037571/sleuthing-and-solving-the-user-logout-bug-on-ios


我刚刚想到的另一个想法是使用应用程序组容器。请参阅此处的问题:WatchKit SDK not retrieving data from NSUserDefaults 这样它不仅应该共享 NSUserDefaults,而且应该共享相同的钥匙串。这应该与 iOS 应用共享相同钥匙串的方式相同。