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

Posted

技术标签:

【中文标题】核心数据处理在后台时需要完整的数据保护【英文标题】:Need complete Data protection while Core Data processing is in background 【发布时间】:2010-11-22 06:49:31 【问题描述】:

我只是卡在项目的中间。

我的目标是保护我的数据

我浏览过 Nickharris 的博客 (Core Data and Enterprise iPhone Applications – Protecting Your Data)

但在结论中明确提到:

如果您的应用程序需要您的Core Data 存储在任何后台处理中,那么您不能使用数据保护。任何尝试访问 NSFileProtectionComplete 的文件都会导致异常

我在后台处理中使用核心数据。

请对此提供帮助。我无论如何都想加密和保护我的数据

谢谢, 塔里克

【问题讨论】:

你在做什么样的后台处理? 【参考方案1】:

ios 5 上,您可以使用其中任何一个,但每个都有一个问题。

    NSFileProtectionCompleteUnlessOpen - 文件以加密格式存储在磁盘上,必须在设备解锁时打开。一旦打开,您的文件可能会继续正常访问该文件,即使用户锁定了设备。

    NSFileProtectionCompleteUntilFirstUserAuthentication - 文件以加密格式存储在磁盘上,直到设备启动后才能访问。用户首次解锁设备后,您的应用程序可以访问该文件并继续访问该文件,即使用户随后锁定了该设备。

来源:iOS Developer Library

【讨论】:

有什么问题?你会推荐哪一个?【参考方案2】:

根据documentation NSFileProtectionComplete 规定,当应用程序处于后台(或未运行)时,无法读取或写入文件。

您应该可以在应用程序运行时读取/写入 SQLite 存储,但是当它处于“后台”时您将无法访问它。

这意味着利用 iOS 后台 API 的操作如下:

推送通知 背景音频/位置 任务完成(背景) IP 语音

将无法访问您的 SQLite 存储。但是,当应用程序运行时,您应该能够像往常一样访问 NSPersistentStoreCoordinator。我怀疑设备端测试会导致无法从其中一个后台 API 创建持久存储协调器。

【讨论】:

【参考方案3】:

在主线程中进行文件访问调用 - NSObject 上有一个非常有用的方法可以帮助你:)

// When you need to get the data from the file do this :
NSData *data = [self performSelectorInMainThread:@selector(getFileData:) withObject:filename waitUntilDone:YES];


// And somewhere else in your class have this method
- (NSData *)getFileData:(NSString *)filename 
    ...
    // Get data from file and return it
    ....

希望对您有所帮助。

【讨论】:

我认为他的意思是应用程序在后台,而不是来自后台线程。当应用程序处于前台时,即使使用 NSFileProtectionComplete,您仍然可以从后台线程访问数据库。

以上是关于核心数据处理在后台时需要完整的数据保护的主要内容,如果未能解决你的问题,请参考以下文章

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

数据保护、钥匙串和核心数据的 Sqlite 文件

核心数据和数据保护

当应用程序启用数据保护时,在 ios 中写入 nsuser 默认值时出现 CfPrefrences 错误

5G/4G加/解密+完整性保护/校验算法源码详解

5G/4G加/解密+完整性保护/校验算法源码详解