📚 构建长期复利型知识基础设施的指南,详见 RAG 实战手册

如何在 Mac 电脑上实现微信多开

在 Mac 上轻松实现微信多开,安全无风险,满足同时登录多个账号的需求,提升工作与生活效率。

该方式适用于任何版本的 macOS 和微信,利用 mac 自身的 Bundle 来启动,相当于安装了多个官方微信,无安全风险,可放心使用。

微信是我们在日常生活和工作中不可或缺的通讯工具,许多用户都有在同一台设备上登录多个微信账号的需求。尽管官方客户端不直接支持这一功能,但通过一些简单的技巧,你可以在 Mac 电脑上实现微信的多开功能。

你可能看到过一些介绍如何在 Mac 上实现微信多开的文章或视频,那些技巧大多已经失效,有的可用的也只能在一台电脑上同时登录两个微信,本文将详细介绍如何在 Mac 上同时运行任意多个微信实例。

原理速记

  • 多开关键在于:把副本的 CFBundleIdentifier(Bundle ID)改成不同值,并重新代码签名,系统就会把它当成另一款独立 App,沙盒容器也会换到新的路径(如 ~/Library/Containers/com.tencent.xinWeChat.m2),互不干扰。
  • 为什么要重签:修改了 Info.plist 后原签名失效,不重签会触发 Gatekeeper 安全校验失败。

一键脚本(创建/启动/移除/重建克隆)

保存为 wechat-multi.sh,给执行权限:chmod +x wechat-multi.sh

使用时带上 sudo(因为要向 /Applications 写入)。

#!/usr/bin/env bash
set -euo pipefail

ORIG_APP="/Applications/WeChat.app"
BUNDLE_BASE="com.tencent.xinWeChat"

require_tools() {
  for t in /usr/libexec/PlistBuddy codesign xattr; do
    command -v ${t%% *} >/dev/null 2>&1 || { echo "缺少工具: $t"; exit 1; }
  done
  [[ -d "$ORIG_APP" ]] || { echo "未找到原版 WeChat: $ORIG_APP"; exit 1; }
}

app_path_for_idx() {
  local idx="$1"
  echo "/Applications/WeChat-M${idx}.app"
}

bid_for_idx() {
  local idx="$1"
  echo "${BUNDLE_BASE}.m${idx}"
}

clone_one() {
  local idx="$1"
  local NEW_APP; NEW_APP="$(app_path_for_idx "$idx")"
  local NEW_BID; NEW_BID="$(bid_for_idx "$idx")"

  echo ">>> 克隆 WeChat -> ${NEW_APP} (BundleID=${NEW_BID})"
  sudo rm -rf "$NEW_APP"
  # 复制 App Bundle
  sudo cp -R "$ORIG_APP" "$NEW_APP"

  # 修改 Info.plist 里的标识与显示名
  local PLIST="$NEW_APP/Contents/Info.plist"
  sudo /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $NEW_BID" "$PLIST" \
    || sudo /usr/libexec/PlistBuddy -c "Add :CFBundleIdentifier string $NEW_BID" "$PLIST"
  sudo /usr/libexec/PlistBuddy -c "Set :CFBundleName WeChat-M${idx}" "$PLIST" || true
  sudo /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName WeChat-M${idx}" "$PLIST" || true

  # 清除隔离属性并重新签名(ad-hoc)
  sudo xattr -rc "$NEW_APP"
  sudo codesign --force --deep --sign - --timestamp=none "$NEW_APP"

  echo ">>> 完成: $NEW_APP"
  echo "容器目录将初始化到: ~/Library/Containers/$(bid_for_idx "$idx")"
}

launch_one() {
  local idx="$1"
  local NEW_APP; NEW_APP="$(app_path_for_idx "$idx")"
  [[ -d "$NEW_APP" ]] || { echo "未发现 ${NEW_APP},请先执行 create ${idx}"; exit 1; }
  open -a "$NEW_APP"
}

remove_one() {
  local idx="$1"
  local NEW_APP; NEW_APP="$(app_path_for_idx "$idx")"
  local NEW_BID; NEW_BID="$(bid_for_idx "$idx")"
  echo ">>> 删除 App 与容器数据 (WeChat-M${idx})"
  sudo rm -rf "$NEW_APP"
  rm -rf "$HOME/Library/Containers/${NEW_BID}"
  echo ">>> 已删除"
}

rebuild_one() {
  local idx="$1"
  echo ">>> 以当前最新版原 App 重新构建 WeChat-M${idx}"
  clone_one "$idx"
}

list_all() {
  ls -1 /Applications | grep -E "^WeChat(-M[0-9]+)?\.app$" || true
}

lock_one() {
  local idx="$1"
  local NEW_APP; NEW_APP="$(app_path_for_idx "$idx")"
  [[ -d "$NEW_APP" ]] || { echo "未发现 ${NEW_APP}"; exit 1; }
  echo ">>> 锁定 ${NEW_APP}(防止被自动更新覆盖)"
  sudo chflags -R uchg "$NEW_APP"
  echo ">>> 已锁定。要解锁:sudo chflags -R nouchg \"$NEW_APP\""
}

unlock_one() {
  local idx="$1"
  local NEW_APP; NEW_APP="$(app_path_for_idx "$idx")"
  [[ -d "$NEW_APP" ]] || { echo "未发现 ${NEW_APP}"; exit 1; }
  echo ">>> 解锁 ${NEW_APP}"
  sudo chflags -R nouchg "$NEW_APP"
}

usage() {
  cat <<'EOF'
用法:
  sudo ./wechat-multi.sh create <idx>    # 创建 WeChat-M<idx> 克隆(如 idx=2 -> WeChat-M2.app)
  ./wechat-multi.sh launch <idx>          # 启动对应克隆
  sudo ./wechat-multi.sh remove <idx>     # 移除克隆及其容器数据
  sudo ./wechat-multi.sh rebuild <idx>    # 原版更新后,按当前原版重建克隆
  ./wechat-multi.sh list                  # 列出 /Applications 下的 WeChat 与克隆
  sudo ./wechat-multi.sh lock <idx>       # 锁定克隆,防止被自动更新覆盖
  sudo ./wechat-multi.sh unlock <idx>     # 解除锁定
示例:
  sudo ./wechat-multi.sh create 2
  ./wechat-multi.sh launch 2
EOF
}

main() {
  local cmd="${1:-}"; shift || true
  case "${cmd}" in
    create) require_tools; clone_one "${1:?缺少 idx}";;
    launch) launch_one "${1:?缺少 idx}";;
    remove) remove_one "${1:?缺少 idx}";;
    rebuild) require_tools; rebuild_one "${1:?缺少 idx}";;
    list) list_all;;
    lock) lock_one "${1:?缺少 idx}";;
    unlock) unlock_one "${1:?缺少 idx}";;
    *) usage;;
  esac
}
main "$@"

常用操作示例

# 创建并启动第二实例(WeChat-M2)
sudo ./wechat-multi.sh create 2
./wechat-multi.sh launch 2

# 再创建第三实例(WeChat-M3)
sudo ./wechat-multi.sh create 3
./wechat-multi.sh launch 3

# 原版 WeChat 更新后,重建 M2
sudo ./wechat-multi.sh rebuild 2

# 防止克隆被自更新覆盖(可选)
sudo ./wechat-multi.sh lock 2   # 锁定
sudo ./wechat-multi.sh unlock 2 # 解锁

更新与维护建议

  1. 官方 WeChat 升级后:克隆可能失效或功能异常,直接运行

    sudo ./wechat-multi.sh rebuild <idx> 重新克隆一遍即可。

  2. 防自更新覆盖(可选):如果发现克隆在自更新后“还原”成原版(Bundle ID 被覆盖),用脚本的 lock 把 WeChat-Mx.app 置为不可变,可降低被覆盖概率(需要更新时再 unlock)。

  3. 区分图标/名称:脚本已把显示名改为 WeChat-Mx,Dock 里更容易分辨;如需更明显的图标,可手动替换 Contents/Resources/*.icns(替换后记得再 codesign)。

常见问题 & 排障

  • 提示“损坏/无法验证/来自不明开发者”

    已在脚本中执行 xattr -rc 与重签;若仍提示,到 系统设置 → 隐私与安全 里允许打开。

  • 为什么副本的登录状态、文件、缓存完全独立?

    因为沙盒容器目录跟随 Bundle ID 改变,例如:

    ~/Library/Containers/com.tencent.xinWeChat.m2/

    删除某个实例的数据,直接删对应容器目录即可(脚本 remove 已自动清理)。

  • 钥匙串反复弹窗

    重签后 Team ID 与签名主体不同,访问某些钥匙串项时可能弹窗,选择“始终允许”即可;不同实例各有自己的容器钥匙串区,不会互相覆盖。

  • open -n 仍只激活同一窗口

    这是 WeChat 单实例守卫导致的正常现象。克隆 + 改 Bundle ID 才能真正多开。

  • URL Scheme/通知冲突

    多个实例同时注册 weixin:// 时,系统可能只把外部链接路由给其中一个;这与多开并不矛盾,但深链唤起体验可能不一致(属正常限制)。

  • 如何彻底还原?

    sudo ./wechat-multi.sh remove <idx> 删除克隆与其容器数据;保留原版即可。

安全与合规提示

  • 克隆需要对 App 做本地修改与 ad-hoc 重签,仅限自用。请务必从官方渠道更新原版后再重建克隆,避免长期停留在旧版本。
  • 锁定(chflags uchg)会阻止写入,偶尔可能让内置更新失败并报错,这是预期表现;更新时记得 unlock。

总结

通过以上步骤,你可以在 Mac 电脑上实现微信的多开功能,同时保持各个实例的独立性和安全性。这种方法适用于任何版本的 macOS 和微信,并且不会对系统造成任何损害。

文章导航

评论区