当前位置:   article > 正文

iOS 应用剖析-目录结构_ios 修改shared目录

ios 修改shared目录

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

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

熟知应用如何存储和操作私有目录下的各种数据,包括配置文件、资源文件、二进制文件以及文档。先来看本地存储,查看 ~/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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这是一个简单的字典,包含了很多嵌套的键值对,这些键值对存储了应用程序的基本信息,包括该应用能够运行的平台、代码签名等。

设备目录

从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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在应用程序目录中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"];
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/915375
推荐阅读
相关标签
  

闽ICP备14008679号