赞
踩
乙亥末,庚子春,荆楚大疫,染着数万。
众惶恐,皆闭户,街无车舟,万巷空寂。
举国防,南山抵守江南郡,率白衣军众数万,
然九州一心,政医兵者扛鼎逆行,为之勇战矣,
能者皆竭力,月余疫尽去,华等初上,万国赞,
此为大幸!
熟知应用如何存储和操作私有目录下的各种数据,包括配置文件、资源文件、二进制文件以及文档。先来看本地存储,查看 ~/Library/Developer/CoreSimulator/Devices 目录。只要在模拟器上运行过应用,Xcode就会根据当前设备类型和系统版本建立一个文件夹分配一个UUID。也是相当占存储空间的,可以定时清理掉没用的。
应用的二进制文件和资源文件(包括.nib文件和图形文件)都放置在< device ID>/data/Containers/Bundle/Application/< app bundle id>目录下(如下图红框)。而经常变化的动态数据则存储在~< device ID>/data/Containers/Data/Application/< app bundle id>目录中(如下图绿框)。系统数据(如全局配置文件)将存储在其余的目录下。
如果你的设备已经越狱,那么你可以使用SSH连接到设备查看它的目录结构。没有越狱的设备,可以使用iExplorer这样的工具来查看安装应用程序的目录结构,如下图。
iOS 将应用程序的配置数据存储在属性列表(plist)文件中,这些信息都是Core Foundation 数据类型,比如CFArray和CFString。从安全角度来熟,需要重点检查plist文件中不是纯文本的值,比如证书,它们有可能会被修改从而改变应用程序的行为。
属性列表有两种格式:二进制和xml,一般情况是用xcode对plist进行查看和编辑,使用xcode的优势在于,它可以用下拉菜单来显示所有可用的键,这些键对应不同类型的值。用命令行中处理plist文件是可以通过SSH与越狱设备进行交互的,用到的话也是需要掌握的。这里就先看下xml格式吧。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>zh_CN</string>
<key>CFBundleDisplayName</key>
<string>测试</string>
。。。
</dict>
</plist>
这是一个简单的字典,包含了很多嵌套的键值对,这些键值对存储了应用程序的基本信息,包括该应用能够运行的平台、代码签名等。
从iOS8开始,模拟器平台都存储在以唯一标识符命名的目录下。由两部分组成:一部分是从Xocde启动模拟器选择的设备类型,另一部分是系统版本。所有目录都有一个plist文件记录当前的设备信息。也就是~/Library/Developer/CoreSimulator/Devices/< app bundle id>/device.plist 文件。如下
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>UDID</key> <string>DB790A2E-378F-4CD4-871D-DBF1A6541B77</string> <key>deviceType</key> <string>com.apple.CoreSimulator.SimDeviceType.iPhone-11</string> <key>isDeleted</key> <false/> <key>isEphemeral</key> <false/> <key>name</key> <string>iPhone 11</string> <key>runtime</key> <string>com.apple.CoreSimulator.SimRuntime.iOS-13-3</string> <key>runtimePolicy</key> <string>Latest</string> <key>state</key> <integer>3</integer> </dict>
在应用程序目录中data目录包含所有的模拟器文件,还包括应用相关的数据。应用数据被分别放到三个目录中,分别是Bundle、Data和Shared目录,都放在data/Containers 目录下。
Bundle目录中有一个Application 目录,该目录包含设备上所有的应用目录。在应用目录中,.app文件夹存储应用程序的核心二进制代码、图像资源、本地化信息等;info.plist文件包含应用程序的核心配置信息,包含bundle标示、主程序包、应用程序的UI信息以及应用程序需要向设备请求的功能。
Data目录中最重要的是Application目录,该目录包含了应用程序运行所需要的其他数据,如参数设置、缓存、cookie等。这个目录也是需要重点检查的对象,因为大部分数据泄漏都发生于此。
Docunments目录主要用来存储非临时状态的应用数据,比如用户创建的内容或应用程序在离线模式下需要的本地缓存信息。在Info.plist 文件中设置了 UIFileSharingEnabled,那么可以通过iTunes访问这些文件。
其他应用发送过来的文件存储在 Docunments/Inbox 目录中。可以使用UIDocumentInteractionController 类来发送文件。
注意,目录树中的目录不一定会全部存在,有一些是使用特定的API所创建的。
你只能读取或删除存储在 Inbox 目录下的文件。这些来自于其他应用程序的文件不能写入你的应用目录里,它们将被一个优先级更高的系统进程处理。你可以定期删除这些文件,也可以让用户操作删除。
如果你想确保磁盘上不会遗留任何敏感信息,那么可以将 Inbox 目录中的文档复制到另外一个位置,从而对数据进行保护,然后从 Inbox 目录中移除这些文件。
注意,你的应用程序请求打开的任意文件都有可能永久的遗留在磁盘中。比如,你打开一个应用程序无法处理的文件类型,那么被推荐使用第三方应用打开,我们无法知道这个第三方应用是否会将它删除,或者也许会将文件永久保留下来。
Library 目录包含应用程序相关的大部分文件,包括由应用程序或网络产生的缓存数据。Library 目录下的文件可以通过 iTunes 和 iCloud 进行备份,Caches 目录除外。
Application Support 目录主要用来存储应用程序使用的数据文件。例如应用内购买的下载内容、配置文件等,该目录下的文件可以在应用程序安装时部署,也可以有应用程序创建或从网络上下载。
默认情况下,iTunes 会备份这个目录下的数据到计算机和 iCloud 中。可以通过为新创建的文件设置 NSURLIsExcludedFromBackupKey 属性来禁止备份到云端。
注意,苹果只要求应用备份用户数据,不要求应用备份应用数据。如果应用程序允许将应用相关的内容备份到云端,比如可下载内容,那么该应用会被审核拒绝上架。
Caches 目录存放临时数据,应用程序保留数据的主要目的是为了性能。操作系统也会操作该目录下的内容和子文件夹 Snapshots 。iOS 在系统运行空间不足时也会自动删除这些缓存目录,不过并不会删除当前正在运行程序的缓存。
iOS 将应用的偏好设置存储在 Preferences 目录下,但是不允许应用直接编辑目录中的文件。此目录下文件的创建、读取和操作都通过 NSUserDefaults 和 CFPreferences API 来完成。
tmp 目录用来存储临时文件。当应用程序停止运行时,该目录中包含的文件可能会被操作系统自动删除。此目录的使用方法与 Caches 目录类似,不同之处在于 Caches 意味者缓存的这些文件可能会被再次获取或重新创建,而 tmp 存储的是由应用产生的临时数据,如果这些文件重新访问前被删除,然而并不能重新获取到它们。
Shared 目录是一个特殊的目录。为应用程序提供一个共享的应用组。苹果要求所有的扩展都必须对应一个容器应用,每一个容器应用会拥有自己的应用ID。扩展及其容器应用可以通过 Shared 目录来共享数据。例如,应用可以使用 NSUserDefaults 的初始化方法,指定一个名字来访问用户数据中共享的数据库。
[[NSUserDefaults alloc] initWithSuiteName:@"com.test1.app"];
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。