codecamp

为在 OpenClaw macOS 应用上工作的开发者提供的设置指南

macOS 开发者设置

本指南涵盖从源代码构建和运行 OpenClaw macOS 应用程序的必要步骤。

前置条件

在构建应用之前,确保你已安装以下内容:

  1. Xcode 26.2+:Swift 开发所需。
  2. Node.js 22+ & pnpm:Gateway 网关、CLI 和打包脚本所需。

1. 安装依赖

安装项目范围的依赖:

pnpm install

2. 构建和打包应用

要构建 macOS 应用并将其打包到 dist/OpenClaw.app,运行:

./scripts/package-mac-app.sh

如果你没有 Apple Developer ID 证书,脚本将自动使用 ad-hoc 签名-)。

有关开发运行模式、签名标志和 Team ID 故障排除,请参阅 macOS 应用 README: https://github.com/openclaw/openclaw/blob/main/apps/macos/README.md

注意:Ad-hoc 签名的应用可能会触发安全提示。如果应用立即崩溃并显示"Abort trap 6",请参阅故障排除部分。

3. 安装 CLI

macOS 应用期望全局安装 openclaw CLI 来管理后台任务。

安装方法(推荐):

  1. 打开 OpenClaw 应用。
  2. 转到 General 设置标签页。
  3. 点击 "Install CLI"

或者,手动安装:

npm install -g openclaw@<version>

故障排除

构建失败:工具链或 SDK 不匹配

macOS 应用构建期望最新的 macOS SDK 和 Swift 6.2 工具链。

系统依赖(必需):

  • 软件更新中可用的最新 macOS 版本(Xcode 26.2 SDK 所需)
  • Xcode 26.2(Swift 6.2 工具链)

检查:

xcodebuild -version
xcrun swift --version

如果版本不匹配,更新 macOS/Xcode 并重新运行构建。

授予权限时应用崩溃

如果在尝试允许语音识别麦克风访问时应用崩溃,可能是由于 TCC 缓存损坏或签名不匹配。

修复:

  1. 重置 TCC 权限:
    tccutil reset All bot.molt.mac.debug
  2. 如果这不起作用,在 scripts/package-mac-app.sh 中临时更改 BUNDLE_ID 以强制 macOS 从"全新状态"开始。

Gateway 网关无限期"Starting..."

如果 Gateway 网关状态一直停留在"Starting...",检查是否有僵尸进程占用端口:

openclaw gateway status
openclaw gateway stop


## 如果你没有使用 LaunchAgent(开发模式/手动运行),找到监听器:
lsof -nP -iTCP:18789 -sTCP:LISTEN

如果手动运行占用了端口,停止该进程(Ctrl+C)。作为最后手段,杀死你找到的 PID。

在 Raspberry Pi 上运行 OpenClaw(低预算自托管方案)
OpenClaw Mac 菜单栏状态逻辑及向用户展示的内容
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

OpenClaw 消息渠道

OpenClaw 工具

OpenClaw 模型

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }