2

我需要在当前的 Swift 模块中存储一些私有数据(当前会话票证或设置) 。对于简单的应用程序,选项通常是NSUserDefaults磁盘上的某个文件,所以我不需要任何应用程序使用我Cocoa Touch Framework的能够从外部访问(至少修改)这些数据,因为某些应用程序可能会为某些人清理它自己的文档文件夹原因和开发人员可能根本不知道我存储在这里的数据。与 的情况相同NSUserDefaults

模块是否有自己的文档文件夹?

我只是想知道,这样做的正确方法是什么?

任何帮助都会很棒,谢谢!

4

1 回答 1

2

一个 Swift 模块定义了一个框架。框架有自己的捆绑包(它们可以用于框架附带的静态资产),但我相信没有 API 指南或约定来定义它们应该在哪里保存框架想要从应用程序中隐藏的数据。

如果您查看 Apple 的文件系统编程指南,它只有一节关于定义“应用程序特定”位置以保存数据。框架编程指南似乎没有说明定义每个框架的位置。

鉴于此,我将在我的框架代码中做的只是使用特定于应用程序的存储位置,但将我的所有框架数据放在一个子目录或独特的键字符串下,清楚地用框架的名称标记它并且很可能是独特的。因此,我不会保存到 Application Support/ 目录,而是保存到 Application Support/MyFramework/。

这将阻止您的框架踩踏托管应用程序的数据。它不会阻止恶意托管应用程序检查您的框架正在保存的内容,但这是一个更难解决的问题。此外,如果一个编写笨拙的托管应用程序只是用通配符擦除了它自己的所有数据,它可能会擦除你的数据,但这可能是它的意图。

更新:

正如评论者所建议的,钥匙串也是一个合理的地方。但是钥匙串的安全基础设施并没有(我相信)实际上以加密方式保护您免受托管应用程序的侵害。尽管如此,托管应用程序不太可能意外完全清除它是一个关键值存储。

如果您真的想尝试从托管应用程序中隐藏大量框架的数据,那么,或者,您可以探索使用URLForDirectory(_:inDomain:appropriateForURL:create:)来查找系统范围(而不是特定于应用程序)的临时目录,然后将框架的数据隐藏在那里. 但我认为所有这些目录都可以被系统随意删除,所以它只有在你保存框架可以稍后重新生成的数据时才有效,也许基于较小的数据种子,存储在像钥匙串这样的地方.

底线是,如果您要交付一个框架供其他人使用,您不能对使用该框架的应用程序开发人员强行隐藏任何内容。他们可以附加调试器。然后你就输了。(如果您想深入了解这一点,有一个称为“白盒密码学”的整个领域,它描述了保护数据免受可以完全观察您操作的对手的攻击。这是现代 DRM 系统的基础。)

于 2015-09-02T15:17:18.970 回答