iOS 沙盒 理解 文件系统

来源:互联网 发布:结婚礼物 知乎 编辑:程序博客网 时间:2024/05/16 14:21

iOS安全模型的精髓在于**沙盒**(sandbox)。在安装应用时,系统会在文件系统中创建一个自己的主目录,而且仅对该应用可读。这导致不同应用之间共享信息很难,但与此同时,恶意软件或粗制滥造的软件要想获取或修改开发者的数据也不容易。

应用之间并不是通过标准的UNIX文件权限来区分的。所有应用都以同一User ID运行(501,mobile)。不过,对其他应用的主目录调用stat失败的原因是操作系统的限制。类似限制还会阻止应用访问/var/log,但允许访问/System/Library/Frameworks。

沙盒里有四个重要的顶级目录:.app捆绑目录(.app bundle)、Documents、Library和tmp。尽管我们可以在沙盒中创建新目录,但iTunes如何处理它们并没有明确定义。推荐将所有内容都保存在某个顶级目录中。为了更好地组织,可以在Library下创建子目录。

.app捆绑目录是Xcode最终构建出来并复制到设备上的包。其中所有内容都经过了数字签名,所以无法修改。尤其是其中还包含开发者的Resources目录。要修改作为捆绑安装的文件,需要先将它们复制到其他地方,通常是Library中。

Documents目录存储用户可见数据,尤其是文字处理文档或绘图文件等,用户一般会为这类文件命名。如果打开Info.plist中的UIFileSharingEnabled选项,那么这些文件可以通过文件共享出现在桌面上。

Library目录存储那些不能直接被用户看见的文件。大部分文件都应该放在Library/Application Support目录下。这些文件会自动备份,如果不想备份的话,可以使用NSURL setResourceValue:forKey:error:方法为文件加上NSURLIsExcluedFromBackupKey属性。


很难理解,苹果iOS 5在NSURL中增加setResourceValues:error:方法。NSURL代表URL,而不是位于该URL的资源。如果作为NSFileManager的一部分,该方法会更有意义。笔者已经在Radar^〔1〕^系统上提交了一份报告,希望最终能获得较好的一致性。


~〔1〕苹果的缺陷管理系统称为Radar(https://bugreport.apple.com),所以本书中提到某个缺陷有时也用Radar指代。——译者注~

Library/Caches目录很特殊,它不会被备份,但会在应用升级过程中保留。可以将不想复制到桌面上的大部分内容放在这里。

tmp目录很特殊,它既不会被备份,也不会在应用升级过程中保留。所以它是存放临时文件的理想位置,一看名字就应该能猜到。系统可能会在程序不运行时删除程序tmp目录中的文件。

在考虑用户数据的安全性时,备份是非常重要的概念。用户可能会选择使用密码来加密iTunes备份。如果数据不应该以明文方式在桌面机器上存储,那就应该将其存储在钥匙串(keychain,参见15.4节)中。iTunes只有在启用备份加密功能时才会备份钥匙串。

如果某些信息不想让用户看到,可以将它们存储到钥匙串中,或是Library/Caches目录下(该位置的内容不会备份)。但这只能起到微弱的保护,因为用户总能通过越狱来读取任何文件或钥匙串。目前还没有特别有效的办法阻止设备所有者从设备上读取数据。iOS安全性旨在保护用户免受攻击,而不是限制用户访问应用本身。

0 0