该方式适用于任何版本的 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 # 解锁
更新与维护建议
官方 WeChat 升级后:克隆可能失效或功能异常,直接运行
sudo ./wechat-multi.sh rebuild <idx>
重新克隆一遍即可。防自更新覆盖(可选):如果发现克隆在自更新后“还原”成原版(Bundle ID 被覆盖),用脚本的 lock 把 WeChat-Mx.app 置为不可变,可降低被覆盖概率(需要更新时再 unlock)。
区分图标/名称:脚本已把显示名改为 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 和微信,并且不会对系统造成任何损害。