一键脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #!/bin/bash # macOS WeChat Dual Instance Script # Usage: # sudo ./wechat-dual.sh auto --force
set -euo pipefail
# 颜色 RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
# 默认路径 WECHAT_APP="/Applications/WeChat.app" DEST_DIR="/Applications" NEW_APP_NAME="WeChat2.app" FORCE=0
# 工具检测 require_cmd() { command -v "$1" >/dev/null 2>&1 || { echo -e "${RED}缺少命令: $1${NC}"; exit 1; } } for cmd in ditto codesign xattr /usr/libexec/PlistBuddy; do require_cmd "$cmd"; done
# 检查微信是否已安装 check_wechat() { if [ ! -d "$WECHAT_APP" ]; then echo -e "${RED}未找到微信: $WECHAT_APP${NC}" exit 1 fi echo -e "${GREEN}✓ 检测到微信已安装${NC}" }
# 删除旧的 WeChat2 remove_wechat2() { local dest="$DEST_DIR/$NEW_APP_NAME" if [ -d "$dest" ]; then echo -e "${YELLOW}⚠ 检测到已存在 $NEW_APP_NAME${NC}" if [ $FORCE -eq 1 ]; then echo -e "${YELLOW}--force 模式,直接删除旧副本${NC}" sudo rm -rf "$dest" else read -p "是否删除并重新创建? (y/n): " yn [[ $yn =~ ^[Yy]$ ]] && sudo rm -rf "$dest" fi fi }
# 复制应用 copy_wechat() { echo -e "${BLUE}① 正在复制微信应用...${NC}" sudo ditto "$WECHAT_APP" "$DEST_DIR/$NEW_APP_NAME" echo -e "${GREEN}✓ 复制完成${NC}" }
# 修改 Bundle ID modify_bundle_id() { local info_plist="$DEST_DIR/$NEW_APP_NAME/Contents/Info.plist" local new_id="com.tencent.xinWeChat.dual.$RANDOM" echo -e "${BLUE}② 修改 Bundle ID 为 $new_id${NC}" sudo /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $new_id" "$info_plist" sudo /usr/libexec/PlistBuddy -c "Set :CFBundleDisplayName WeChat Dual" "$info_plist" || true echo -e "${GREEN}✓ Bundle ID 修改完成${NC}" }
# 重新签名 resign_app() { local dest="$DEST_DIR/$NEW_APP_NAME" echo -e "${BLUE}③ 清理旧签名并重新签名${NC}" sudo rm -rf "$dest/Contents/_CodeSignature" || true sudo xattr -dr com.apple.quarantine "$dest" || true sudo codesign --force --deep --sign - --timestamp=none "$dest" echo -e "${GREEN}✓ 签名完成${NC}" }
# 启动两个微信 start_dual() { echo -e "${BLUE}④ 启动微信双开${NC}" open -n "$WECHAT_APP" sleep 1 open -n "$DEST_DIR/$NEW_APP_NAME" echo -e "${GREEN}✓ 已启动两个微信实例${NC}" }
# 关闭所有微信 kill_wechat() { echo -e "${YELLOW}正在关闭所有微信进程...${NC}" pkill -f "WeChat" || true echo -e "${GREEN}✓ 所有微信已关闭${NC}" }
# 主逻辑 main() { case "${1:-}" in setup) check_wechat remove_wechat2 copy_wechat modify_bundle_id resign_app ;; start) start_dual ;; auto) check_wechat remove_wechat2 copy_wechat modify_bundle_id resign_app start_dual ;; -k|kill) kill_wechat ;; -h|--help|"") echo "用法: $0 {setup|start|auto|kill} [--force]" ;; *) echo -e "${RED}未知参数: $1${NC}" exit 1 ;; esac }
# 解析 --force for arg in "$@"; do [[ $arg == "--force" ]] && FORCE=1; done main "$@"
|
执行脚本
1 2 3
| chmod +x wechat-dual.sh sudo ./wechat-dual.sh auto --force
|
手动操作
准备工作
- 一台装有 macOS 系统的 Mac 电脑。
- 已从 App Store 或官网安装了最新版的微信。
- 了解如何打开“终端” (Terminal) 应用(在“应用程序” > “实用工具”里可以找到)。
操作步骤
整个过程只需三步,请依次在终端中执行以下命令。
第一步:复制应用
首先,我们需要复制一个微信应用的副本,并给它一个新的名字,例如 微信2.app
。
打开“终端”,输入以下命令后按回车:
1
| sudo cp -R /Applications/WeChat.app /Applications/微信2.app
|
命令解析:
sudo
: 以管理员权限执行命令,因此会提示你输入电脑的开机密码(输入时密码不可见,输完按回车即可)。
cp -R
: 复制整个文件夹(因为 .app
文件本质上是一个文件夹)。
/Applications/WeChat.app
: 原始微信应用的路径。
/Applications/微信2.app
: 新应用的路径和名称。
执行完毕后,你会在“应用程序”文件夹里看到一个名为“微信2”的应用图标。
第二步:修改应用唯一标识符
macOS 系统通过一个名为 CFBundleIdentifier
的唯一标识符来区分不同的应用。为了让系统认为“微信”和“微信2”是两个独立的应用,我们必须修改副本的标识符。
继续在终端中输入以下命令:
1
| sudo /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier net.maclub.wechat2" /Applications/微信2.app/Contents/Info.plist
|
命令解析:
/usr/libexec/PlistBuddy
: macOS 内置的用于编辑 .plist
文件的工具。
-c "Set :CFBundleIdentifier net.maclub.wechat2"
: 这是核心指令。Set
是设置操作,:CFBundleIdentifier
是要修改的键,net.maclub.wechat2
是我们为新应用设置的新的、唯一的标识符(你可以自定义,但建议保持格式,确保不与现有应用冲突)。
/Applications/微信2.app/Contents/Info.plist
: 指向副本应用的配置文件路径。
⚠️ 常见错误提示:Unrecognized Command
如果你执行此命令后看到 Unrecognized Command
错误,99% 的原因是你使用了错误的引号!
- 错误:
“Set :CFBundleIdentifier ...”
(中文或富文本的全角弯引号)
- 正确:
"Set :CFBundleIdentifier ..."
(英文半角的直引号)
从网页复制命令时,请务必检查引号的格式是否正确。建议直接复制本文提供的代码块。
第三步:重新签名应用
由于我们修改了应用的内容(Info.plist
文件),原有的代码签名已经失效。macOS 的安全机制(Gatekeeper)会阻止运行签名被破坏的应用。因此,我们需要对其进行一次强制的本地重新签名。
在终端中输入最后一条命令:
1
| sudo codesign --force --deep --sign - /Applications/微信2.app
|
命令解析:
codesign
: macOS 的代码签名工具。
--force
: 强制替换现有的签名。
--deep
: 递归地为应用包内的所有组件(如框架、插件)进行签名。
--sign -
: 使用一个临时的、本地生成的(ad-hoc)签名进行签署。
/Applications/微信2.app
: 需要签名的目标应用。
大功告成!
现在,所有步骤都已完成!
回到“访达” > “应用程序”文件夹,你会看到 微信2.app
图标已经可以正常显示。双击它,熟悉的登录二维码界面就会出现。现在你可以登录第二个微信账号了,两个微信可以完美地同时运行,互不干扰。
你还可以将 微信2.app
拖到程序坞(Dock)上,方便日后快速启动。
后续维护
-
如何更新?
通过这种方式创建的 微信2.app
不会跟随 App Store 自动更新。当你的主微信更新后,如果希望 微信2
也更新,只需删除旧的 微信2.app
,然后重新按照本文的步骤操作一遍即可。
-
如何卸载?
直接将 微信2.app
拖到废纸篓即可。其聊天记录等数据存储在 ~/Library/Containers/
目录下,以你设置的标识符命名(例如 net.maclub.wechat2
),如果需要彻底清理,可以一并删除该文件夹。
希望这篇教程能帮助你提升在 Mac 上的工作与沟通效率!