前言

之前在知乎上看到一篇 mac 版微信双开的教程,步骤大概是:复制一份 WeChat.app,改一下 Bundle ID,重新签名,然后用 nohup 启动。试了一下确实能用,手动操作了一遍,成功双开了。

但是这个过程说实话挺繁琐的——每次都要打开终端敲好几条 sudo 命令,稍微手滑一下就可能复制错路径或者签错名。而且如果微信更新了,分身的签名就失效了,又得重新来一遍。

更要命的是,如果想三开、四开,还得把教程里的所有 2 改成 34,分别再操作一遍。知乎原帖评论区就有人问"三开怎么改",作者还得专门出一个更新贴把要改的地方标出来 🤣

所以我就想,能不能写个命令行工具把这些步骤自动化?一行命令搞定创建、修复、删除,顺便再做个交互式界面方便不熟悉命令行的朋友使用。

说干就干。

效果展示

先看下最终效果。

CLI 模式,一行命令创建 3 个分身:

$ wechat-clone create 3
正在创建 3 个微信分身...

  ✓ 分身 1 创建成功: /Applications/WeChat Clone 1.app
  ✓ 分身 2 创建成功: /Applications/WeChat Clone 2.app
  ✓ 分身 3 创建成功: /Applications/WeChat Clone 3.app

完成!

查看已有分身:

$ wechat-clone list
找到 3 个微信分身:

  WeChat Clone 1.app  com.tencent.xinWeChat.clone1
  WeChat Clone 2.app  com.tencent.xinWeChat.clone2
  WeChat Clone 3.app  com.tencent.xinWeChat.clone3

环境检查:

$ wechat-clone doctor
正在检查环境...

  ✓ 系统平台: macOS
  ✓ 微信应用: 已找到: /Applications/WeChat.app
  ✓ codesign: 可用
  ✓ PlistBuddy: 可用
  ✓ 写入权限: /Applications 可访问
  ✓ 磁盘空间: 请确保有足够空间(每个分身约 400MB+)
  ✓ 已有分身: 暂无分身

环境检查通过! 可以正常使用。

不想敲命令?直接运行 wechat-clone 进入交互式 TUI 界面,方向键选择,回车确认:

微信分身管理工具

使用 ↑↓ 键选择,Enter 确认,q 退出

▸ 创建分身
  查看分身列表
  启动分身
  修复分身
  删除分身
  环境检查

↑/↓ 移动  •  Enter 选择  •  q 退出

安装

brew install star-plan/tap/wechat-clone

没装 Homebrew 也可以去 GitHub Releases 下载二进制,丢到 /usr/local/bin/ 就行。

它做了什么

说白了就是把知乎教程里的手动步骤自动化了。每创建一个分身,工具会依次执行:

  1. sudo cp -R 复制 WeChat.app
  2. sudo PlistBuddy 修改 Info.plist 中的 CFBundleIdentifier
  3. codesign --force --deep --sign - ad-hoc 重新签名
  4. xattr -rd com.apple.quarantine 清除隔离属性

跟手动操作完全一样,只不过不用你自己敲命令了。

修复(repair)就是重复步骤 2-4,微信更新后跑一下就行。删除(remove)就是 sudo rm -rf,带二次确认防手滑。

命令速查

命令 说明
wechat-clone 进入交互式 TUI 界面
wechat-clone doctor 检查环境是否满足要求
wechat-clone create 3 创建 3 个分身
wechat-clone create 3 --force 覆盖已存在的分身
wechat-clone list 列出所有分身
wechat-clone open 显示分身路径,引导在 Finder 中启动
wechat-clone repair 修复所有分身签名
wechat-clone repair 2 修复指定分身
wechat-clone remove 2 删除指定分身(有确认)
wechat-clone remove all --force 强制删除所有分身

技术栈

组件 选择 理由
语言 Go 单二进制分发,无运行时依赖
CLI 框架 cobra Go CLI 标准选择,命令结构清晰
TUI 框架 bubbletea + lipgloss Charm 家族,现代终端 UI 方案
构建/发布 GoReleaser 自动编译多架构 + 推送 Homebrew Formula

项目结构也还算清晰:

wechat-clone/
├── main.go
├── internal/
│   ├── app/       # 业务逻辑(CLI 和 TUI 共享)
│   ├── cli/       # Cobra 命令定义
│   ├── macos/     # macOS 系统操作封装
│   └── tui/       # Bubble Tea 交互界面

分层设计的好处是 CLI 和 TUI 复用同一套业务逻辑,不用写两遍。internal/macos/ 把所有 macOS 特定操作(PlistBuddy、codesign、xattr)都封装好了,上层只管调用。

一些细节

启动方式:创建完分身后,工具不会自动帮你打开微信,而是显示路径引导你去 Finder 里手动启动。主要是自动启动(nohup 调二进制 or open 命令)在不同 macOS 版本上行为不太一致,手动启动反而更可靠。双击 .app 就行,也可以拖到程序坞固定。

编号管理:删除分身 2 后再创建,新分身会是编号 4 而不是填补 2 的空位。简单可靠,不会出现编号冲突的问题。

sudo 权限:复制和修改 /Applications 下的文件需要 sudo,工具会在需要时自动请求,终端会提示输入密码。

数据隔离:每个分身有独立的 Bundle ID,微信会为每个分身创建独立的数据目录,互不影响。多个分身可以同时登录不同的账号。

写在最后

本质上就是一个把 5 条终端命令打包成一个工具的小项目,没什么黑科技。但确实省了不少事——尤其是需要多开或者微信更新后要重新签名的场景。

源码在 GitHub,Apache 2.0 协议,欢迎提 issue 和 PR。

就这样了 👋