乙亥末,庚子春,荆楚大疫,染着数万。
众惶恐,皆闭户,街无车舟,万巷空寂。
举国防,南山抵守江南郡,率白衣军众数万,
然九州一心,政医兵者扛鼎逆行,为之勇战矣,
能者皆竭力,月余疫尽去,华等初上,万国赞,
此为大幸!

目录结构(模拟器、真机)

熟知应用如何存储和操作私有目录下的各种数据,包括配置文件、资源文件、二进制文件以及文档。先来看本地存储,查看 ~/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这样的工具来查看安装应用程序的目录结构,如下图。

对 plist 文件进行处理

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 目录

Bundle目录中有一个Application 目录,该目录包含设备上所有的应用目录。在应用目录中,.app文件夹存储应用程序的核心二进制代码、图像资源、本地化信息等;info.plist文件包含应用程序的核心配置信息,包含bundle标示、主程序包、应用程序的UI信息以及应用程序需要向设备请求的功能。

二、Data 目录

Data目录中最重要的是Application目录,该目录包含了应用程序运行所需要的其他数据,如参数设置、缓存、cookie等。这个目录也是需要重点检查的对象,因为大部分数据泄漏都发生于此。

  • Docunments 和 Inbox 目录

Docunments目录主要用来存储非临时状态的应用数据,比如用户创建的内容或应用程序在离线模式下需要的本地缓存信息。在Info.plist 文件中设置了 UIFileSharingEnabled,那么可以通过iTunes访问这些文件。

其他应用发送过来的文件存储在 Docunments/Inbox 目录中。可以使用UIDocumentInteractionController 类来发送文件。
注意,目录树中的目录不一定会全部存在,有一些是使用特定的API所创建的。

你只能读取或删除存储在 Inbox 目录下的文件。这些来自于其他应用程序的文件不能写入你的应用目录里,它们将被一个优先级更高的系统进程处理。你可以定期删除这些文件,也可以让用户操作删除。

如果你想确保磁盘上不会遗留任何敏感信息,那么可以将 Inbox 目录中的文档复制到另外一个位置,从而对数据进行保护,然后从 Inbox 目录中移除这些文件。

注意,你的应用程序请求打开的任意文件都有可能永久的遗留在磁盘中。比如,你打开一个应用程序无法处理的文件类型,那么被推荐使用第三方应用打开,我们无法知道这个第三方应用是否会将它删除,或者也许会将文件永久保留下来。

  • Library 目录

Library 目录包含应用程序相关的大部分文件,包括由应用程序或网络产生的缓存数据。Library 目录下的文件可以通过 iTunes 和 iCloud 进行备份,Caches 目录除外。

  • Application Support 目录

Application Support 目录主要用来存储应用程序使用的数据文件。例如应用内购买的下载内容、配置文件等,该目录下的文件可以在应用程序安装时部署,也可以有应用程序创建或从网络上下载。

默认情况下,iTunes 会备份这个目录下的数据到计算机和 iCloud 中。可以通过为新创建的文件设置 NSURLIsExcludedFromBackupKey 属性来禁止备份到云端。

注意,苹果只要求应用备份用户数据,不要求应用备份应用数据。如果应用程序允许将应用相关的内容备份到云端,比如可下载内容,那么该应用会被审核拒绝上架。

  • Caches 和 Snapshots 目录

Caches 目录存放临时数据,应用程序保留数据的主要目的是为了性能。操作系统也会操作该目录下的内容和子文件夹 Snapshots 。iOS 在系统运行空间不足时也会自动删除这些缓存目录,不过并不会删除当前正在运行程序的缓存。

  • Preferences 目录

iOS 将应用的偏好设置存储在 Preferences 目录下,但是不允许应用直接编辑目录中的文件。此目录下文件的创建、读取和操作都通过 NSUserDefaults 和 CFPreferences API 来完成。

  • tmp 目录

tmp 目录用来存储临时文件。当应用程序停止运行时,该目录中包含的文件可能会被操作系统自动删除。此目录的使用方法与 Caches 目录类似,不同之处在于 Caches 意味者缓存的这些文件可能会被再次获取或重新创建,而 tmp 存储的是由应用产生的临时数据,如果这些文件重新访问前被删除,然而并不能重新获取到它们。

三、Shared 目录

Shared 目录是一个特殊的目录。为应用程序提供一个共享的应用组。苹果要求所有的扩展都必须对应一个容器应用,每一个容器应用会拥有自己的应用ID。扩展及其容器应用可以通过 Shared 目录来共享数据。例如,应用可以使用 NSUserDefaults 的初始化方法,指定一个名字来访问用户数据中共享的数据库。

[[NSUserDefaults alloc] initWithSuiteName:@"com.test1.app"];

iOS 应用剖析-目录结构相关推荐

  1. iOS沙盒目录结构解析

    iOS沙盒目录结构解析 原文地址:http://blog.csdn.net/wzzvictory/article/details/18269713 出于安全考虑,iOS系统的沙盒机制规定每个应用都只能 ...

  2. iOS项目的目录结构和开发流程

    转自无网不剩的博客 网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法.   目录结构 AppDelegate Models Ma ...

  3. iOS项目工程及目录结构

    做过一些iOS的项目,不同项目的沉淀没有积累到一起,目录的管理都在后期随着人员的增加越来越混乱,因此在这里做一些梳理,希望达到两个目的. 一套相对通用的目录结构,作为后续项目的模版. 积累相应的基础库 ...

  4. 分享我设计的iOS项目目录结构

    公司新项目就要着手研发了,希望能为这个项目多准备点知识.回想自己做过的项目,目录结构的划分总不如我的心意,有些目录命名不规范导致表达不明确,有些目录因为不具有代表性,导致在实际中不能充分发挥作用,导致 ...

  5. iOS项目开发过程中的目录结构(转)

    iOS项目开发过程中的目录结构 我在这个目录结构方面真是吃了不少苦,开始总是觉得快点写快点写,后来发现只有快是不行的,在没有给整个项目的结构有一个清楚的认识和了解之前就匆匆动笔(敲代码啦)是非常冒失的 ...

  6. .classpath文件有什么用_干货分享:Windows目录结构剖析,C盘目录常见文件夹都有什么用?...

    我们天天和文件夹打交道,但是有好多的碍眼的文件夹我们能不能删除呢,来看看今天的文章. 先问一个问题,你对你电脑的文件系统了解多少? 很多人只管用,但是有些时候,想要自己清理一下文件的时候,不太敢删除, ...

  7. [ios]iOS模拟器应用程序目录结构

    iOS模拟器应用程序目录结构 1.压缩包文件(audioDemo)  里面存放资源文件(图片,文本文件,多媒体等) 2.Documents  存放应用程序数据 3.Library   里面有Prefe ...

  8. 深度剖析E680G应用三.目录结构

    深度剖析E680G应用三.目录结构 草木瓜 相关资源下载 http://play.younet.com/view.php?tid=18578 一.前言 本文主要介绍E680g系统应用相关的重要文件和目 ...

  9. ios 获取沙河文件夹_关于 iOS 沙盒的目录结构和获取

    沙盒目录结构 1. /xxName.app 应用程序的程序包目录,包含应用程序的本身. 2. /Documents/ 保存应用程序的重要数据文件和用户数据文件等.用户数据基本上都放在这个位置(例如从网 ...

最新文章

  1. scala学习笔记-过程、lazy值和异常(6)
  2. 解决eclipse project前出现红色感叹号 但没有提示错误出在什么地方build path jar包也没报错...
  3. 31.绿豆蛙的归宿(拓扑排序)
  4. 关于最近实践 Bert 的一些坑
  5. MySQL下perror工具查看System Error Code信息
  6. Django视图(一)
  7. 【Transformer】TransMix: Attend to Mix for Vision Transformers
  8. 矩阵论-线性变换的特征值与特征变换
  9. js 弹出层的点击事件影响到底层的点击事件_聊一聊 Node.js 错误处理
  10. 大数据:技术与应用实践指南_大数据技术与应用社团 社会实践总结篇
  11. 小程序发布上线流程_微信小程序开发到上线流程详解
  12. 40个全球免费开放的电子图书馆
  13. 产品经理简历怎么写?看这一篇就够了
  14. cms10——友情链接
  15. 2020-02-18
  16. web前端html+css实现立体旋转相册(表白可用)
  17. Excel如何批量删除数字单元格前的撇号
  18. 【数学建模】经典简单例题实例1
  19. 全球移动通信系统GSM(2G)
  20. 韦东山数码相框项目进度一

热门文章

  1. 高中英语怎样学好呀,负基础
  2. MATLAB 远程桌面无法连接的问题
  3. 珠宝饰品REACH检测办理
  4. 《Android 应用案例开发大全(第3版)》——第2.4节壁纸的实现
  5. Windows下载安装Intel RealSense SDK2.0
  6. I2C驱动_linux
  7. Sentinel 滑动窗口实现原理 侵删
  8. 【书评】搞车载系统服务?这本入门书或许可以翻一翻
  9. 高新技术企业研发费用怎么归集?
  10. Sping、SpringMVC框架教程