iOS 完整数据保护 + 应用程序:performFetchWithCompletionHandler

Posted

技术标签:

【中文标题】iOS 完整数据保护 + 应用程序:performFetchWithCompletionHandler【英文标题】:iOS Complete Data Protection + application:performFetchWithCompletionHandler 【发布时间】:2014-03-18 14:09:18 【问题描述】:

我有一个 iPad 应用程序,它使用完全数据保护来加密应用程序的内容,除非设备已解锁并正在运行。这是客户要求的,并且按预期工作。

第二个业务需求是我们在后台运行一些 Web 服务调用。这是使用 ios 7 中可用的新 application:performFetchWithCompletionHandler 完成的。我需要从本地 SQLite 数据库中提取一些数字来与 Web 服务的结果进行比较,以便知道我是否需要启动后台下载.这是失败的。

有没有办法配置数据保护,以便我的应用可以在后台读取 SQLite 数据库?

可以逐个文件设置权限吗?

如果做不到这一点,任何人都可以提出解决方法吗? NSUserDefaults? plist 文件?还有什么?

谢谢。

【问题讨论】:

【参考方案1】:

当启用NSFileProtectionComplete 并且设备被锁定时,您无法从 sqlite 数据库中读取。然而,Apple 在 2013 年 WWDC 视频“What's New with Multitasking”@https://developer.apple.com/videos/wwdc/2013/ 大约 44:00 中描述了如何处理这种情况。

由于您的 SQLite 文件设置为 NSFileProtectionComplete,因此您无法在设备锁定时对其进行写入或读取。您应该做的是将任何新数据(在设备锁定时在后台下载)写入磁盘上NSFileProtectionCompleteUnlessOpen 级别的单独文件。这将允许您将数据写入磁盘,并且在您关闭文件时数据将受到保护。当受保护的数据可用时(设备已解锁),您应该将数据合并到您的数据库中。

您可能想尝试在磁盘上创建一个文件,其中包含确定何时发出新数据请求所需的信息。如果您将此文件设置为级别NSFileProtectionCompleteUntilFirstUserAuthentication,您应该仍然能够在设备锁定时读取它。

【讨论】:

【参考方案2】:

失败了

究竟是什么失败了?插入coredata数据库?从您的网络服务器获取详细信息?

您是否有机会在您的 application:performFetchWithCompletionHandler 方法中发布一些代码,以便我们更好地了解到底发生了什么?

【讨论】:

'更新时出错。 'authorization denied'' 是 SQLite 的错误。【参考方案3】:

这需要一些工作,但我们确实找到了一种能够在后台运行代码并仍然保护我们的敏感数据的方法。

我们没有在应用程序级别使用完整的数据保护,而是根据需要逐个文件实施它。并非所有内容都需要保护,只是包含敏感信息的文件。那些在运行时通过以下代码获得完整的数据保护:

NSDictionary *completeAttr = [NSDictionary dictionaryWithObject: NSFileProtectionComplete forKey: NSFileProtectionKey];
BOOL result = [[NSFileManager defaultManager] setAttributes: completeAttr ofItemAtPath: fileName error: &err];
if(result) 
    NSLog(@"File protected %@", fileName);
 else 
    NSLog(@"Unable to protect file %@ error %@", fileName, err);

通过使用这种方法,并将敏感数据与非敏感数据分开,我们可以在后台运行,并且仍然可以访问一些信息,而不会暴露所有信息。

【讨论】:

以上是关于iOS 完整数据保护 + 应用程序:performFetchWithCompletionHandler的主要内容,如果未能解决你的问题,请参考以下文章

iOS - Xcode 错误:由于系统完整性保护而无法附加到进程

iOS 应用程序被拒绝:2. 1 性能:应用程序完整性和 5.1.1 法律:隐私 - 数据收集和存储

性能:应用程序完整性 (iOS) - 应用程序被拒绝

iOS:CloudKit perform(query:) 啥都不做 - 没有执行闭包

核心数据处理在后台时需要完整的数据保护

CKQuery Perform 仅获取在应用程序启动之前创建的记录