---
summary: "安装iMessage插件,在Messages Mac上设置imsg,并授予macOS权限"
read_when:
- "首次设置iMessage通道"
- "针对远程消息 Mac 运行网关"
- "授予完整磁盘访问和自动化"
title: "iMessage 设置"
sidebarTitle: "设置"
---
安装插件,在已登录的 Messages Mac 上安装并验证 `imsg`,配置通道,并授予其所需的 macOS 权限。
## 安装插件
在网关主机上安装官方iMessage插件:
```bash
openclaw plugins install @openclaw/imessage
```
在继续之前检查 [ 申请结果](/plugins/manage-plugins#apply-changes-and-inspect)。
回复、轻点回应、效果、投票、附件和群组管理。
iMessage 私信默认使用配对模式。
当网关不在 Messages 所在的 Mac 上运行时,请使用 SSH 包装器。
iMessage 字段完整参考。
## 快速设置
```bash
brew install steipete/tap/imsg
brew update && brew upgrade imsg
imsg rpc --help
imsg launch
openclaw channels status --probe
```
当本地安装向导检测到缺少默认的 `imsg` 命令时,它可以提示通过 Homebrew 安装 `steipete/tap/imsg`。如果检测到 Homebrew- 管理的 `imsg`,它会提示重新安装或更新。自定义 `cliPath` 包装器未修改。
```json5
{
channels: {
imessage: {
enabled: true,
cliPath: "/usr/local/bin/imsg",
dbPath: "/Users/user/Library/Messages/chat.db",
},
},
}
```
```bash
openclaw gateway
```
```bash
openclaw pairing list imessage
openclaw pairing approve imessage
```
配对请求在 1 小时后过期。
大多数设置不需要 SSH。仅当网关无法在登录的 Messages Mac 上运行时才使用此拓扑。将 `cliPath` 指向 **Gateway 主机** 上的 stdio 兼容包装器,该主机通过 SSH 连接到消息 Mac 并运行 `imsg`。使用包装器的绝对路径,以便服务启动不依赖于 shell 主目录扩展。在该远程 Mac 上安装并更新 `imsg`,而不是在网关主机上:
```bash
ssh messages-mac 'brew install steipete/tap/imsg && brew update && brew upgrade imsg'
```
```bash
#!/usr/bin/env bash
exec ssh -T messages-mac imsg "$@"
```
启用附件时推荐的配置:
```json5
{
channels: {
imessage: {
enabled: true,
cliPath: "/home/openclaw/.openclaw/scripts/imsg-ssh",
remoteHost: "user@messages-mac", // Mac that runs Messages.app and imsg
// This path is interpreted on the Messages Mac, not on the Gateway host.
dbPath: "/Users/user/Library/Messages/chat.db",
includeAttachments: true,
// Optional: extra allowed attachment roots (merged with the default
// /Users/*/Library/Messages/Attachments).
attachmentRoots: ["/Users/*/Library/Messages/Attachments"],
remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],
},
},
}
```
`remoteHost` 用于标识 Messages Mac。OpenClaw 使用它获取入站附件,并暂存出站附件。对于出站文件,OpenClaw 会在该 Mac 上创建一个仅所有者可访问的临时路径,通过现有的严格 SSH/SCP 传输将文件复制过去,仅将远程路径传递给 `imsg`,并尝试在成功、失败或超时后删除该路径。清理操作的 SSH 调用失败时会发出警告,并可能在远程 Mac 上留下仅所有者可访问的临时目录。
建议使用显式的 `remoteHost`,并且在设置时获胜。为了实现兼容性,OpenClaw 在每个进程中自动检测现有的透明 `exec ssh ... imsg "$@"` 包装器形状,并在监视、检查、发送和私有操作中重用该主机。自动检测仅涵盖简单记录的透明包装器;选项丰富的包装器(例如 ProxyJump/ProxyCommand)必须配置 `remoteHost`。 `remoteHost` 必须是 `host` 或 `user@host`(无空格或 SSH 选项);不安全的值将被忽略。 OpenClaw 对 SSH/SCP 使用严格的主机密钥检查,因此消息 Mac 主机密钥必须已存在于网关主机上的 `~/.ssh/known_hosts` 中。根据允许的根 (`attachmentRoots` / `remoteAttachmentRoots`) 验证附件路径。
您放在 `imsg` MUST 前面的任何 `cliPath` 包装器或 SSH 代理的行为就像长寿命 JSON-RPC 的透明 stdio 管道。 OpenClaw 在通道的生命周期内通过包装器的 stdin/stdout 交换小型换行帧 JSON-RPC 消息:
- 一旦字节可用,就转发每个标准输入 chunk/line **** — 不要等待 EOF。
- 立即反向转发每个标准输出 chunk/line。
- 保留换行符。
- 避免固定大小的阻塞读取(`read(4096)`、`cat | buffer`、默认 shell `read`),它们可能会饿死小帧。
- 保持 stderr 与 JSON-RPC stdout 流分离。
缓冲标准输入直到大块填充的包装器将产生看起来像 iMessage 中断的症状 - `imsg rpc timeout (chats.list)` 或重复通道重新启动 - 即使 `imsg rpc` 本身是健康的。 `ssh -T host imsg "$@"`(上面)是安全的,因为它转发 OpenClaw 的 `cliPath` 参数,例如 `rpc` 和 `--db`。像 `ssh host imsg | grep -v '^DEBUG'` 这样的管道是 NOT - 行缓冲工具仍然可以容纳帧;如果必须过滤,请在每个阶段使用 `stdbuf -oL -eL`。
## 要求与权限(macOS)
- Messages 必须在运行 `imsg` 的 Mac 上登录。
- 运行 OpenClaw/`imsg` 的进程上下文需要完全磁盘访问(消息 DB 访问)。
- 通过Messages.app.发送消息需要自动化权限
- 对于高级操作(反应/编辑/取消发送/线程回复/效果/投票/组操作),必须禁用系统完整性保护 - 请参阅 [启用 imsg 私有 API](/channels/imessage/private-api#enabling-the-imsg-private-api)。基本文本和媒体 send/receive 无需它即可工作。
权限是按进程上下文授予的。如果网关以无头方式运行(LaunchAgent/SSH),请在同一上下文中运行一次交互式命令以触发权限提示:
```bash
imsg chats --limit 1
# or
imsg send "test"
```
远程 SSH 设置可以读取聊天、通过 `channels status --probe`,并处理入站消息,但外发发送仍会因 AppleEvents 授权错误而失败:
```text
Not authorized to send Apple events to Messages. (-1743)
```
检查已登录 Mac 用户的 TCC 数据库或“系统设置” > “隐私与安全性” > “自动化”。如果自动化条目记录在 `/usr/libexec/sshd-keygen-wrapper` 而不是 `imsg` 或本地 shell 进程上,macOS 可能不会为该 SSH 服务端客户端暴露可用的 Messages 开关:
```text
kTCCServiceAppleEvents | /usr/libexec/sshd-keygen-wrapper | auth_value=0 | com.apple.MobileSMS
```
在这种状态下,重复执行 `tccutil reset AppleEvents` 或通过同一个 SSH 包装器重新运行 `imsg send` 可能仍然会失败,因为需要 Messages 自动化权限的进程上下文是 SSH 包装器,而不是 UI 可以授予权限的某个应用。
请改用受支持的 `imsg` 进程上下文之一:
- 在已登录的 Messages 用户本地会话中运行 Gateway,或至少运行 `imsg` bridge。
- 在授予同一会话中的完全磁盘访问权限和自动化权限后,使用该用户的 LaunchAgent 启动 Gateway。
- 如果你保留双用户 SSH 拓扑,请在启用通道之前,验证一次真实的外发 `imsg send` 是否能通过确切的包装器成功。如果无法授予自动化权限,请改为单用户 `imsg` 设置,而不要依赖 SSH 包装器来发送消息。