> For the complete documentation index, see [llms.txt](https://ryukiedev.gitbook.io/wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ryukiedev.gitbook.io/wiki/myapps/yin-si-fang-wen-ji-lu/03.-ru-he-fen-xi-ios15-yin-si-fang-wen-ji-lu.md).

# 03.如何分析iOS15隐私访问记录

### 前言

iOS15 发布后，系统的 `记录App活动` 的功能和 `隐私洞见` 也是火了一小把。当然我也抱着学习SwiftUI（蹭热度）的态度，用SwiftUI速成了一个分析工具：[隐私访问记录](https://apps.apple.com/cn/app/id1590992377)

### 概述

在 `iOS 15.2`、`iPadOS 15.2` 和 `watchOS 8.3` 或更高版本中，用户可以查看应用程序的隐私访问报告：

* 访问某些类型的用户数据，如`照片`和`联系人`。
* 访问敏感的设备资源，如`摄像头`和`麦克风`。
* 联系人网络域，包括用户从应用程序中访问的网站（仅限 `iOS` 和 `iPadOS`）。

检查应用程序为此摘要提供的数据，以了解报告向用户显示的内容，并确保应用程序按预期运行。

### 开始记录应用活动

用户可以通过选择`隐私`>`记录App活动`，然后点击`“打开记录App活动`，从`设置`应用在其设备上启用应用活动记录。

系统会记录`最近7天`的应用活动记录——仅存储在用户的设备上。 在自己的设备上打开此功能后，使用应用程序对其数据、资源和网络访问进行全面测试。 请务必使用该应用程序足够长的时间以允许任何延迟访问。 多长时间取决于应用程序的行为。

### 获取应用活动数据

运行应用一段时间后，可以通过点击应用隐私报告屏幕上的共享按钮来获取有关应用活动的报告：

![1](/files/jFV3RS5OIUqbWfkncoD8)

![2](/files/d31P5d1kZJAa7qNM15fx)

![3](/files/0o3RwKHFwdSTpaxUjQOq)

将报告保存到可以检查的位置。 例如，可以使用 AirDrop 将其发送到附近的 Mac。

该报告使用换行符分隔的 `JSON 格式 (NDJSON)`，可以使用任何文本编辑器打开该格式，并包含由换行符分隔的 JSON 字典集合。 类型键的值设置为 `access` 的字典提供有关资源访问的信息，而类型键的值设置为 `networkActivity` 的字典提供有关网络活动的信息：

```json
{..., "type":"access", ...}
{..., "type":"access", ...}
...
{..., "type":"networkActivity", ...}
{..., "type":"networkActivity", ...}
...
```

### 检查资源访问数据

文件中的每个访问字典都代表特定应用程序访问的开始或结束。

下面显示了此字典的示例，其中添加了空格、换行符和注释以提高可读性：

```
{
  "accessor" : { 
    "identifier" : "com.example.calendar", // The app accessing the resource.
    "identifierType" : "bundleID"
  },
  "broadcaster": { // Only present for screen recording.
    "identifier" : "com.apple.springboard", // The app broadcasting the screen.
    "identifierType" : "bundleID"
  },
  "category" : "screenRecording", // The accessed resource.
  "identifier" : "8A4054BB-1810-4F8B-8163-483409E2D35C", // A unique identifier.
  "kind" : "intervalBegin", // Whether this the beginning or end of an interval.
  "timeStamp" : "2021-08-06T15:46:13.532-07:00", // The time of the access.
  "type" : "access" // This is resource access data.
}
```

要查找应用程序进行的访问，请查找具有访问器键的所有访问字典，该访问器键的字典值包含应用程序的包标识符。 使用 category 字段确定应用访问了哪些资源，并使用 timeStamp 字段将访问与生成访问的活动相关联。 可能会遇到以下任何类别值：

|     Category    |         Resource         |
| :-------------: | :----------------------: |
|      camera     |    The device’s camera   |
|     contacts    |    The user’s contacts   |
|     location    |       Location data      |
|   mediaLibrary  | The user’s media library |
|    microphone   |  The device’s microphone |
|      photos     | The user’s photo library |
| screenRecording |      Screen sharing      |

每次资源访问都发生在一个时间间隔内，并生成一对访问字典以指示：

* 区间的开始，`kind` 字段设置为 `intervalBegin` ，如上例所示。
* 间隔结束，`kind` 字段设置为 `intervalEnd`。

绑定访问间隔的两个字典具有相同的标识符键值。

对于 `screenRecording` 类别，字典还包含一个广播键，其值指示应用程序将屏幕广播到访问器，通常是 `Springboard`。

### 检查网络活动

从 `iOS` 或 `iPadOS` 导出的文件包含另一组字典，这些字典的类型键和值设置为 `networkActivity` 以报告网络访问。 每个字典都描述了由指定应用程序与特定域建立的连接。 下面显示了这个字典的一个例子，为了清楚起见，再次添加了空格和换行符：

```
{
  "domain" : "api.example.com",
  "firstTimeStamp" : "2021-06-06T16:15:48Z",
  "context" : "",
  "timeStamp" : "2021-06-06T16:15:59Z",
  "domainType" : 2,
  "initiatedType" : "AppInitiated",
  "hits" : 10,
  "type" : "networkActivity",
  "domainOwner" : "",
  "bundleID" : "com.example.App1"
}
```

字典包括以下描述网络活动的关键字：

* domain
  * 域名
* firstTimeStamp
  * 首次访问的时间
* context
  * 建立连接的网站（如果适用）。
* timeStamp
  * 最近访问的时间
* domainType
  * 当值为 1 时，域已被识别为可能跨应用程序和站点收集信息，并可能分析用户。
  * 当值为 2 表示尚未识别该域。
* initiatedType
  * 是应用（AppInitiated）还是用户（NonAppInitiated）发起了连接。
* hits
  * 应用在过去 7 天内联系域的次数。
* type
  * networkActivity 的关联值表示该字典描述网络活动数据。
* domainOwner
  * 域的所有者（如果适用）。
* bundleID
  * bundleID

在决定如何设置初始类型键的值时，系统会将来自应用程序中的 Web 浏览器的连接（例如实例化 SFSafariViewController 时）归因于用户。否则，系统会将应用与 URL 加载系统或网络框架等低级接口建立的任何连接视为应用启动。这包括从服务器加载以直接响应用户操作的用户数据。

当通过设置一个属性进行一般网络请求时，可以更改此键的关联值。比如创建一个URLRequest的时候，设置attribution属性；使用 NWConnection 实例时，调用 nw\_parameters\_set\_attribution(*:*:) 函数。但是，仅更改用户直接完全控制的连接的归因，例如当用户输入 URL 或点击或单击他们可以阅读的 URL 时。有关网络归因的更多信息，请参阅指明网络活动的来源。

### 考虑应用程序是否需要更改

如果发现应用建立了无法识别的网络连接，或访问了不该访问的资源，请检查应用。 仔细检查集成的任何第三方框架或模块，因为它们可能会产生意外连接。

### 参考

[Inspecting App Activity Data](https://developer.apple.com/documentation/network/privacy_management/inspecting_app_activity_data)
