# 安装并启动 macOS 客户端：从下载到排障

文档用途：给首次安装的 Mac 用户使用，也给 AI/远程协助人员按症状定位问题。
操作顺序：先确认机器和安装包，再安装，再首次放行，最后用本机状态接口验证。

## 0. AI 先读取的固定事实

- 安装包文件名：`data_interface_macos_arm64.dmg`
- 支持架构：Apple Silicon ARM64。终端执行 `uname -m` 必须看到 `arm64`。
- 最低系统版本：macOS 11.0。
- 应用名称：`DataInterface.app`
- 应用安装位置：推荐 `/Applications/DataInterface.app`
- 本机状态接口：`http://127.0.0.1:9527/api/status`
- 管理端口：9527，固定不变。
- 数据服务端口：默认 8080；管理页可以在启动前改成其他未占用端口。
- macOS 用户数据目录：`~/Library/Application Support/DataInterface/`
- 配置文件：`~/Library/Application Support/DataInterface/config.ini`
- 崩溃诊断目录：`~/Library/Application Support/DataInterface/diagnostics/crash/`
- 应用默认后台运行，不一定显示窗口或 Dock 图标；这不是没有启动的证据。
- 默认不会随系统自动启动；登录管理页后可点击“自启”开启。

如果用户是 Intel Mac，`uname -m` 会显示 `x86_64`。当前发布包不是 Intel 架构，不能靠反复点击或删除隔离属性解决，应该先获取适配架构的安装包。

## 1. 下载

1. 打开项目提供的下载页面，点击“下载客户端”，选择“macOS ARM64”。
2. 确认下载完成，文件名应为 `data_interface_macos_arm64.dmg`。如果仍显示 `.part`、`.download` 等临时后缀，先等待下载结束。
3. 在“关于本机”中确认“芯片”是 Apple Silicon；也可以打开“终端”执行：

```bash
uname -m
```

预期结果：

```text
arm64
```

不要直接运行下载目录中的半成品文件，也不要为了绕过架构不匹配而执行隔离属性命令。

## 2. 安装

1. 在“访达”的“下载”目录双击 `data_interface_macos_arm64.dmg`。
2. 在弹出的磁盘映像窗口中，把 `DataInterface.app` 拖到 `Applications` 文件夹图标上，等待复制完成。
3. 关闭磁盘映像窗口。
4. 在访达左侧边栏找到已挂载的磁盘映像，点击旁边的推出按钮；也可以右键选择“推出”。
5. 后续必须从“应用程序”目录启动 `/Applications/DataInterface.app`，不要一直从 DMG 窗口或下载目录启动。

如果复制到“应用程序”时要求输入密码，这是 macOS 对系统应用目录的正常权限确认。输入当前 Mac 用户有权限使用的管理员凭据即可。

## 3. 首次启动与 macOS 放行

首次启动只需按下面方法放行一次。不要关闭系统安全功能，也不要给不明来源的程序执行放行命令。

### macOS 14 及更早版本

1. 打开“应用程序”目录。
2. 按住 Control 点按（或右键点按）`DataInterface.app`，选择“打开”。
3. 弹出确认框后再次点击“打开”。

### macOS 15 及以后版本

1. 先双击一次 `DataInterface.app`。如果出现“无法验证”或类似提示，点击“完成”关闭提示。
2. 打开“系统设置”→“隐私与安全性”。
3. 向下滚动，在安全性区域找到刚才被阻止的应用，点击“仍要打开”。
4. 输入 Mac 登录密码或使用指纹确认。
5. 回到“应用程序”目录，再次双击 `DataInterface.app`。

放行成功的标志是进程开始运行；应用是后台程序，不一定出现独立窗口。

## 4. 启动成功验证

1. 启动 `DataInterface.app` 后等待约 1～10 秒。
2. 默认会尝试打开管理页面。最终应以本机管理页为准；如果浏览器没有自动打开，手动访问：

```text
http://127.0.0.1:9527/
```

3. 也可以在“终端”执行状态检查：

```bash
curl -fsS --max-time 5 http://127.0.0.1:9527/api/status
```

4. 只要返回 JSON，就说明管理端进程和 9527 端口已经正常工作。正常响应通常包含类似字段：

```json
{"exeConnected":true,"adminPort":9527,"proxyPort":8080}
```

字段可能随版本增加，不要要求响应文本必须完全相同。

5. 在管理页输入账号信息并登录。账号已验证后，点击“启动”开启数据服务；默认端口是 8080。客户端调用本地接口时，使用管理页显示的 `proxyPort` 和 `d1`～`d6`、`d101`、`d201`、`d202` 等本地接口编号。

注意：打开管理页不等于数据服务已经启动。`/api/status` 能返回 JSON 只能证明管理端正常；还要看页面状态是否显示“数据服务运行中”。

## 5. 日常使用、退出、升级与卸载

### 每次开机

默认不会开机自启。每次开机后从“应用程序”双击 `DataInterface.app`，然后打开本机管理页即可。

登录管理页后点击“自启”，按钮显示“自启 ✓”时表示已开启。再次点击可关闭。建议先把应用安装到 `/Applications`，再开启自启；不要频繁移动 App 位置。

“开页”控制启动后是否自动打开本机管理页。关闭“开页”不会停止数据服务。

### 正常退出

1. 在管理页点击“退出”，这是退出整个应用；“停止”只停止数据服务。
2. 如果管理页无法访问，打开“活动监视器”，搜索 `data_interface`，选中对应进程后点击左上角的停止/结束按钮。
3. 退出旧进程后等待 1～2 秒再重新启动。

macOS 使用单实例保护：旧进程还在时，第二次启动不会再创建第二个进程，新的启动会直接退出。这是预期行为。

### 升级

1. 先在管理页点击“退出”；如果页面打不开，就用“活动监视器”结束旧进程。
2. 下载新的 `data_interface_macos_arm64.dmg`，重复第 2 节，把新 App 拖入“应用程序”，选择“替换”。
3. 如果新版首次运行再次被系统拦截，重复第 3 节的放行流程。

账号、配置和设备数据保存在用户数据目录，不在 App 包内；正常替换 App 不会丢失这些数据。

### 卸载

1. 先退出应用，并在管理页关闭“自启”。
2. 把 `/Applications/DataInterface.app` 移到废纸篓。
3. 如果只是卸载程序，建议保留 `~/Library/Application Support/DataInterface/`，以后重装可继续使用原配置。
4. 只有明确要“全新初始化”时，才在退出程序后备份或移走这个目录。不要直接删除唯一副本。

## 6. 按症状排障

以下编号适合 AI 远程协助时直接引用。每次先记录 macOS 版本、CPU 架构、安装包文件名和完整报错原文。

### [MAC-01] 提示“无法验证开发者”“无法打开”

判断：这是首次启动的系统安全拦截，不代表端口或账号有问题。

处理：

1. 先确认 App 位于 `/Applications`。
2. 按第 3 节使用 Control/右键“打开”。
3. macOS 15 及以后，到“系统设置”→“隐私与安全性”点击“仍要打开”。
4. 再次启动，并用 `curl` 检查 9527。

### [MAC-02] 提示“应用已损坏，无法打开”

常见原因是下载文件不完整，或 App 带有下载隔离属性。只对确认来自项目可信下载页的 App 执行下面命令。

先查看属性：

```bash
xattr -l "/Applications/DataInterface.app"
```

确认来源可信后，可移除隔离属性：

```bash
xattr -dr com.apple.quarantine "/Applications/DataInterface.app"
```

然后 Control/右键点 App 选择“打开”。如果仍然失败，优先重新下载 DMG、删除旧 App 后重新拖入“应用程序”，不要继续对疑似损坏的文件反复放行。

### [MAC-03] 双击后没有任何窗口

判断：正常。应用默认以后台服务运行，没有独立窗口或 Dock 图标。

验证：

```bash
curl -fsS --max-time 5 http://127.0.0.1:9527/api/status
```

有 JSON 就是已启动；然后在浏览器打开 `http://127.0.0.1:9527/`。如果没有 JSON，再按 [MAC-04] 排查进程和端口。

### [MAC-04] 本机管理页打不开，9527 连接失败

先依次执行：

```bash
pgrep -fl data_interface
lsof -nP -iTCP:9527 -sTCP:LISTEN
curl -v --max-time 5 http://127.0.0.1:9527/api/status
```

分流：

- 没有 `data_interface` 进程：从“应用程序”重新启动，或检查 [MAC-01]/[MAC-02]。
- 有进程但没有 9527 监听：应用可能启动后立即退出，查看 [MAC-08] 的崩溃诊断。
- 9527 被其他 PID 占用：按 [MAC-05] 处理，不要盲目结束不认识的进程。
- 9527 有监听但浏览器打不开：确认访问的是 `127.0.0.1` 而不是远程地址，重新执行 `curl`，再尝试无痕窗口。

### [MAC-05] 9527 端口被占用

执行：

```bash
lsof -nP -iTCP:9527 -sTCP:LISTEN
```

记录输出中的 `COMMAND`、`PID` 和 `NAME`。如果占用者是旧的 `data_interface`，先在“活动监视器”退出旧实例；如果是其他程序，先正常退出该程序或联系设备管理员。管理端口 9527 是固定端口，普通配置不能改成别的端口。

### [MAC-06] 管理页能打开，但“启动”失败或数据接口不可用

先看 `/api/status` 中的 `isLoggedIn`、`isVerified`、`running` 和 `proxyPort`：

- `isLoggedIn=false`：先登录。
- `isVerified=false`：账号尚未完成有效期/权限验证，按页面提示处理。
- `running=false`：点击“启动”，管理页端口正常不代表数据服务已启动。
- `running=true` 但请求失败：确认客户端请求的是 `127.0.0.1:<proxyPort>`，并且路径使用管理页提供的本地接口编号。

### [MAC-07] 默认 8080 被占用

检查：

```bash
lsof -nP -iTCP:8080 -sTCP:LISTEN
```

在管理页“启动”按钮左侧的端口输入框改成未占用端口，再点击“启动”。启动成功后，以 `/api/status` 返回的 `proxyPort` 为准，并同步修改客户端请求地址。不要把 8080 占用问题误判成 9527 管理端故障。

### [MAC-08] 应用启动后立即退出、反复崩溃

崩溃日志目录：

```text
~/Library/Application Support/DataInterface/diagnostics/crash/
```

用访达打开：

```bash
open "$HOME/Library/Application Support/DataInterface/diagnostics/crash"
```

也可以查看最近的系统记录：

```bash
log show --last 10m --style compact --predicate 'process == "data_interface" OR eventMessage CONTAINS[c] "data_interface"'
```

把最新一份崩溃日志和发生时间交给 AI/技术人员。不要只说“打不开”，要说明是双击后立即退出，还是运行几分钟后退出。

### [MAC-09] 浏览器没有自动打开，或打开后不是本机管理页

1. 手动打开 `http://127.0.0.1:9527/`。
2. 确认 [MAC-04] 的状态检查能返回 JSON。
3. 管理页顶部的“开页 ✓”表示启动后自动打开网页；如果显示“开页”，点击一次开启。
4. 若手动编辑配置，先退出应用，在配置文件的 `[General]` 节中设置：

```ini
OpenWebOnLaunch=1
```

如果只想关闭自动开页，设置为 `0`。修改后重新启动应用。不要把完整 `config.ini` 发给别人。

### [MAC-10] 提示“已有实例运行”，或第二次双击没有反应

这是单实例保护。先执行：

```bash
pgrep -fl data_interface
```

如果能看到旧进程，优先在管理页点击“退出”，否则用“活动监视器”结束对应进程。等待 1～2 秒后再启动。不要同时从 DMG、下载目录和“应用程序”启动多个副本。

### [MAC-11] 登录失败、验证失败或接口请求超时

当 9527 能返回 JSON 时，安装和本机管理端通常已经正常；此类问题优先检查：

1. Mac 是否能正常联网。
2. 系统日期和时间是否正确。
3. VPN、代理、防火墙或网络安全软件是否拦截程序联网。
4. 账号、密码和权限/有效期是否正确。
5. 是否只启动了管理端，尚未在页面点击“启动”开启数据服务。

不要因为登录失败反复安装 App，也不要把密码、卡密、Token 或完整配置文件粘贴到聊天记录中。

### [MAC-12] 升级后仍启动旧版本，或自启失效

1. 退出所有旧进程：`pgrep -fl data_interface`。
2. 确认实际启动的是 `/Applications/DataInterface.app`，不要从旧 DMG 或旧下载目录启动。
3. 升级后重新打开本机管理页，查看页面显示的版本号。
4. 自启失效时，在管理页先点击“自启”关闭，再点击一次开启；应用位置固定后再做此操作。
5. 如果不再需要自启，卸载前务必先关闭“自启”。

## 7. 给 AI/远程协助的安全采集模板

只采集定位问题所需的信息，不要索要完整账号配置。可以让用户执行下面命令并回传已脱敏结果：

```bash
sw_vers -productVersion
uname -m
pgrep -fl data_interface
lsof -nP -iTCP:9527 -sTCP:LISTEN
lsof -nP -iTCP:8080 -sTCP:LISTEN
curl -fsS --max-time 5 http://127.0.0.1:9527/api/status
```

同时记录：

- 现象编号，例如 `[MAC-02]` 或 `[MAC-05]`；
- 用户执行到第几步；
- macOS 版本和 `uname -m` 结果；
- 安装包完整文件名；
- 弹窗完整文字或截图；
- 是否能返回 `/api/status`；
- 最新崩溃日志的文件名和时间。

脱敏要求：`config.ini` 可能包含账号凭据、设备信息或其他敏感配置；只能提供相关键名和错误现象，不能直接发送完整文件、密码、卡密或 Token。
