diff --git a/connector/DISTRIBUTION.md b/connector/DISTRIBUTION.md
index 8885558..b6f410a 100644
--- a/connector/DISTRIBUTION.md
+++ b/connector/DISTRIBUTION.md
@@ -17,5 +17,5 @@
## 分发说明
- macOS 请完整分发 `.app`;Windows 可直接分发 `.exe` 和本说明。
-- macOS 版本只适用于其标记的 CPU 架构(Apple Silicon 或 Intel)。Windows 版本也需在 Windows 上构建。
+- macOS Universal 2 版本同时支持 Apple Silicon 与 Intel Mac,最低系统版本为 macOS 11.0。Windows 版本仍需在 Windows 上构建。
- 面向其他 Mac 分发时,建议使用 Apple Developer ID 签名并公证,避免 Gatekeeper 提示。
diff --git a/connector/README.md b/connector/README.md
index dba7263..19db9a0 100644
--- a/connector/README.md
+++ b/connector/README.md
@@ -68,6 +68,6 @@ npm run connector
npm run build:connector
```
-macOS 会生成 `release/connector/macos-<架构>/Spine粒子连接器.app`;Windows 会生成 `release/connector/windows-<架构>/Spine粒子连接器.exe`。桌面程序由 C++17 编写,运行时不依赖 Node.js。默认使用 macOS 的 Apple Clang;Windows 应在 Visual Studio Developer Command Prompt 中执行,默认使用 MSVC,也可通过 `CXX` 指定 MinGW g++。
+macOS 会生成 `release/connector/macos-universal/Spine粒子连接器.app`,同时支持 Apple Silicon 与 Intel Mac,最低系统版本为 macOS 11.0;Windows 会生成 `release/connector/windows-<架构>/Spine粒子连接器.exe`。桌面程序由 C++17 编写,运行时不依赖 Node.js。默认使用 macOS 的 Apple Clang;Windows 应在 Visual Studio Developer Command Prompt 中执行,默认使用 MSVC,也可通过 `CXX` 指定 MinGW g++。
面向其他 Mac 正式分发时,建议使用 Apple Developer ID 对 `.app` 签名并公证,避免 Gatekeeper 提示。
diff --git a/release/connector/Spine粒子连接器-macOS-Universal.zip b/release/connector/Spine粒子连接器-macOS-Universal.zip
new file mode 100644
index 0000000..3d0b969
Binary files /dev/null and b/release/connector/Spine粒子连接器-macOS-Universal.zip differ
diff --git a/release/connector/macos-universal/Spine粒子连接器.app/Contents/Info.plist b/release/connector/macos-universal/Spine粒子连接器.app/Contents/Info.plist
new file mode 100644
index 0000000..29633a2
--- /dev/null
+++ b/release/connector/macos-universal/Spine粒子连接器.app/Contents/Info.plist
@@ -0,0 +1,14 @@
+
+
+
+CFBundleDisplayNameSpine粒子连接器
+CFBundleExecutableSpineParticleConnector
+CFBundleIdentifiercom.spineparticle.connector
+CFBundleInfoDictionaryVersion6.0
+CFBundleNameSpine粒子连接器
+CFBundlePackageTypeAPPL
+CFBundleShortVersionString2.0.0
+CFBundleVersion2.0.0
+LSMinimumSystemVersion11.0
+NSHighResolutionCapable
+
diff --git a/release/connector/macos-universal/Spine粒子连接器.app/Contents/MacOS/SpineParticleConnector b/release/connector/macos-universal/Spine粒子连接器.app/Contents/MacOS/SpineParticleConnector
new file mode 100755
index 0000000..12cdd66
Binary files /dev/null and b/release/connector/macos-universal/Spine粒子连接器.app/Contents/MacOS/SpineParticleConnector differ
diff --git a/release/connector/macos-universal/Spine粒子连接器.app/Contents/_CodeSignature/CodeResources b/release/connector/macos-universal/Spine粒子连接器.app/Contents/_CodeSignature/CodeResources
new file mode 100644
index 0000000..d5d0fd7
--- /dev/null
+++ b/release/connector/macos-universal/Spine粒子连接器.app/Contents/_CodeSignature/CodeResources
@@ -0,0 +1,115 @@
+
+
+
+
+ files
+
+ files2
+
+ rules
+
+ ^Resources/
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/
+
+ nested
+
+ weight
+ 10
+
+ ^.*
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^Resources/
+
+ weight
+ 20
+
+ ^Resources/.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^Resources/.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Resources/Base\.lproj/
+
+ weight
+ 1010
+
+ ^[^/]+$
+
+ nested
+
+ weight
+ 10
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/release/connector/macos-universal/使用说明.md b/release/connector/macos-universal/使用说明.md
new file mode 100644
index 0000000..b6f410a
--- /dev/null
+++ b/release/connector/macos-universal/使用说明.md
@@ -0,0 +1,21 @@
+# Spine粒子连接器(桌面版)
+
+连接器是原生桌面应用,**无需安装 Node.js**。
+
+## 使用
+
+1. 正常安装并激活 Spine;连接器不会包含或替代 Spine 软件。
+2. macOS 打开“Spine粒子连接器.app”;Windows 打开“Spine粒子连接器.exe”。打开应用即启动连接器。
+3. 回到网页,等待导出区域显示“连接器可用 · Spine 已就绪”。
+4. 首次使用生产网站时,点击网页中的“授权当前网站”,在打开的本机页面确认完整域名后点击“允许此网站”。
+5. 可在应用内点击“断开连接”,或直接关闭应用来停止连接器。
+
+若状态显示“未找到 Spine”,可在路径输入框中直接输入路径,或点击“选择 Spine.com”。Windows 请选择 `Spine.com`;macOS 请选择 `Spine.app/Contents/MacOS/Spine`。保存后下次启动仍然有效;“恢复自动检测”会清除手动路径。
+
+连接器仅监听 `127.0.0.1:27843`,不会对局域网或公网开放。授权按完整来源区分,例如 `https://editor.example.com` 与 `https://editor.example.com:8443` 需要分别授权。
+
+## 分发说明
+
+- macOS 请完整分发 `.app`;Windows 可直接分发 `.exe` 和本说明。
+- macOS Universal 2 版本同时支持 Apple Silicon 与 Intel Mac,最低系统版本为 macOS 11.0。Windows 版本仍需在 Windows 上构建。
+- 面向其他 Mac 分发时,建议使用 Apple Developer ID 签名并公证,避免 Gatekeeper 提示。
diff --git a/scripts/build-connector-app.mjs b/scripts/build-connector-app.mjs
index 36b060c..bebfc05 100644
--- a/scripts/build-connector-app.mjs
+++ b/scripts/build-connector-app.mjs
@@ -19,7 +19,8 @@ function run(command, args) {
}
async function buildMac() {
- const packageDir = join(releaseRoot, `macos-${arch()}`)
+ const packageDir = join(releaseRoot, 'macos-universal')
+ const archive = join(releaseRoot, 'Spine粒子连接器-macOS-Universal.zip')
const app = join(packageDir, 'Spine粒子连接器.app')
const executable = join(app, 'Contents', 'MacOS', 'SpineParticleConnector')
await rm(packageDir, { recursive: true, force: true })
@@ -27,6 +28,7 @@ async function buildMac() {
await mkdir(join(app, 'Contents', 'Resources'), { recursive: true })
run(process.env.CXX || 'clang++', [
'-std=c++17', '-O2', '-Wall', '-Wextra', '-Werror', '-fobjc-arc',
+ '-arch', 'arm64', '-arch', 'x86_64', '-mmacosx-version-min=11.0',
...commonSources, join(native, 'app_macos.mm'),
'-framework', 'AppKit', '-framework', 'Foundation', '-o', executable,
])
@@ -47,7 +49,13 @@ async function buildMac() {
`, 'utf8')
await cp(join(root, 'connector', 'DISTRIBUTION.md'), join(packageDir, '使用说明.md'))
- console.log(`已生成 macOS 应用:${app}`)
+ // 绑定 Info.plist 并封装资源,防止传输后被 macOS 判定为损坏。
+ // 正式公开分发时仍应使用 Developer ID 替换此临时签名并完成公证。
+ run('codesign', ['--force', '--deep', '--sign', '-', app])
+ await rm(archive, { force: true })
+ run('ditto', ['-c', '-k', '--sequesterRsrc', '--keepParent', packageDir, archive])
+ console.log(`已生成 macOS Universal 2 应用(arm64 + x86_64,最低 macOS 11.0):${app}`)
+ console.log(`已生成可分发压缩包:${archive}`)
}
async function buildWindows() {