Presenton Mac App Store 打包全流程从证书、Profile 到 .pkg 的 MAS 构建流水线【免费下载链接】presentonOpen-Source AI Presentation Generator and API (Gamma, Canva, Beautiful AI, Decktopus, Presentations AI Alternative)项目地址: https://gitcode.com/GitHub_Trending/pr/presentonPresenton 是一款开源的 AI 演示文稿生成器Electron 壳子里套着 Next.js 前端和 FastAPI 后端。这篇文章只讲一件事如何给这个 Electron 项目做 Mac App StoreMAS打包。你先去 Apple 后台办好证书和 Provisioning Profile再配好 entitlements 沙盒权限最后用 build.js 里的 MAS 构建脚本跑出能传 App Store Connect 的.pkg。看完你可以独立走完全链路不用再翻别的资料。MAS 构建和普通 macOS 打包到底差在哪普通 Mac 应用用 Developer ID 签名、靠公证过 Gatekeeper。MAS 应用不一样Apple 强制要求启用 App Sandbox 沙盒签名工具链也不同所以构建配置是另一套。还有个硬约束Apple 的签名工具只能在 macOS 上跑。MAS 构建必须在一台装了 Xcode 命令行工具的 Mac 上执行Linux 或 Windows 上直接会报错。Presenton 在 macOS 上分了三个打包目标全由PRESENTON_MAC_TARGET环境变量驱动值不同走不同分支目标用途npm 脚本dmgApp Store 之外的直接下载分发npm run build:all:mac:signedmas-dev在注册过的 Mac 上做沙盒测试npm run build:all:mas-devmas提交 App Storenpm run build:all:mas两个关键常量写死在 build.js 顶部APP_ID是com.presenton.presentonTEAM_ID是S6W5C54KL6后者通过mac.extendInfo.ElectronTeamID写进应用。另外 electron/package.json 当前的版本号带-beta后缀0.9.11-beta。这个后缀会让 MAS 构建没法自己推出版本号你后面还得手动指定 Store 版本号第五节细讲。动手之前把 Apple 那边的手续办齐MAS 上架前Apple 那边要备齐四样东西。顺序别乱账号 → 证书 → App ID → Profile。账号用一个开发者账号登录 Xcode。下面所有操作都从这里开始。两张证书很多人以为只要一张其实 MAS 分发构建要两张。第一张是应用证书名字得匹配Apple Distribution或3rd Party Mac Developer Application第二张是安装包证书得匹配3rd Party Mac Developer Installer。build.js 的resolveMasSigningIdentities会同时找这两张缺一就抛错。申请路径都一样Xcode → Settings → Accounts → 你的团队 → Manage Certificates → 点。给mas-dev和沙盒测试用的选Apple Development。给mas提交用的选Apple Distribution应用证书。安装包证书走 Portal 里对应的 3rd Party Installer 流程。App IDBundle ID进 Developer Portal → Certificates, Identifiers Profiles → Identifiers → App IDs建一个和com.presenton.presenton一致的 macOS App ID。换成自己的 ID就得同步改 build.js 里的APP_ID。两个 Provisioning Profile进 Portal → Profiles →各建一个 macOS profile把下下来的.provisionprofile放进electron/build/项开发 Profile分发 Profile类型macOS App DevelopmentMac App Store关联证书Apple DevelopmentApple Distribution文件名build/AppleDevelopment.provisionprofilebuild/MacAppStore.provisionprofile回退文件名AppleDev、AppDevAppDistri回退文件名见 build.js。开发目标还接受AppleDev.provisionprofile、AppDev.provisionprofile分发目标接受AppDistri.provisionprofile。仓库里已经放了一个占位文件electron/build/MacAppStore.provisionprofile.replace_me就写着你该怎么生成真 Profile。你拿真 Profile 顶掉它即可。 千万别把真实.provisionprofile提交进 git仓库的 gitignore 也会拦它。Profile 按年过期过期了重新生成、换本地文件就行。下完先验证能解码cd electron security cms -D -i build/AppleDevelopment.provisionprofile security cms -D -i build/MacAppStore.provisionprofileEntitlements给沙盒应用开哪些门沙盒应用默认啥都干不了得逐条开权限。entitlements.mas.plist 里每个条目都对应一个具体动作你可以把它理解成沙盒里的一排开关com.apple.security.app-sandbox总开关启用 App SandboxMAS 的硬性要求。com.apple.security.application-groups值写的是S6W5C54KL6.com.presenton.presenton让应用和它各组件共享同一个容器目录。com.apple.security.cs.allow-jit放行 JIT 编译Electron 渲染进程靠它跑起来。com.apple.security.network.client和com.apple.security.network.server一个允许发起连接、一个允许监听撑起内置的 Next.js / FastAPI 本地服务。com.apple.security.files.user-selected.read-write读写用户主动选的文件覆盖导入文档、导出 PPTX 这些操作。com.apple.security.files.downloads.read-write读写下载目录。辅助进程那一份 entitlements.mas.inherit.plist 只声明app-sandbox和com.apple.security.inherit意思就是跟着主进程的能力边界走不用再重复开。Profile 的解码校验也放在这里说。build.js 的canDecodeProvisioningProfile先调security cms -D -i profile试解码不行就回退openssl cms -inform DER -verify -noverify。两条都过不了说明文件坏了或是占位文件构建会带着清晰报错停下而不是硬着头皮带坏签名继续打包。环境变量控制构建行为的遥控器构建行为基本被这组变量拿捏住变量适用目标说明PRESENTON_MAC_TARGET由 npm 脚本设置mas-dev或mas别手动设PRESENTON_MAS_DEV_IDENTITYmas-dev签名身份如Apple Development: Your Name (TEAMID)PRESENTON_MAS_DISTRIBUTION_IDENTITYmas分发身份如Apple Distribution: Your Org (TEAMID)PRESENTON_MAS_IDENTITYmas分发身份的别名CSC_NAME两种目标目标专属身份没设时的回退PRESENTON_APP_STORE_VERSIONmasStore 版本号x.y.zpackage 带-beta时必填PRESENTON_APP_STORE_BUILDmasStore build 号没设就取短版本号版本号这块要多说两句因为当前 package 版本带-beta后缀mas构建时PRESENTON_APP_STORE_VERSION是必填。build.js 里getAppStoreBundleShortVersion优先读这个变量校验它必须匹配/^\d\.\d\.\d$/没设时才去 package 版本号里截(\d)\.(\d)\.(\d)前缀截不出来就抛 Cannot derive an App Store version from package version。getAppStoreBundleVersion读PRESENTON_APP_STORE_BUILD用/^\d(\.\d){0,2}$/校验1 到 3 段点分整数比如42或1.0.1没设就回退到短版本号。带 beta 后缀时这样设export PRESENTON_APP_STORE_VERSION1.0.0 export PRESENTON_APP_STORE_BUILD42还有两个冷门的时间戳开关在 build.js。PRESENTON_CODESIGN_TIMESTAMP1能恢复 codesign 时间戳——默认 MAS 本地打包走--timestampnone就是为了不依赖 Apple 的时间戳服务。PRESENTON_CODESIGN_TIMESTAMP_RETRIES控制时间戳失败的重试次数默认 4 次。执行构建从 setup 到 .pkg所有命令都在electron/下跑。头一次用先初始化环境npm run setup:env它会把npm install、FastAPI 的uv sync、Next.js 依赖安装以及导出运行时和 ImageMagick 的准备一次做完。完整构建会重建 Next.js、FastAPI、导出运行时再打包。两个目标各一条# mas-dev只在开发 Profile 注册过的 Mac 上能跑 PRESENTON_MAS_DEV_IDENTITYApple Development: Your Name (TEAMID) \ npm run build:all:mas-dev # mas用于上传 App Store Connect PRESENTON_MAS_DISTRIBUTION_IDENTITYApple Distribution: Your Org (TEAMID) \ PRESENTON_APP_STORE_VERSION1.0.0 \ npm run build:all:mas资源已经建好、只想重跑 electron-builder 打包阶段时用dist:*PRESENTON_MAS_DEV_IDENTITYApple Development: Your Name (TEAMID) \ npm run dist:mac:mas-dev PRESENTON_MAS_DISTRIBUTION_IDENTITYApple Distribution: Your Org (TEAMID) \ PRESENTON_APP_STORE_VERSION1.0.0 \ npm run dist:mac:masbuild.js 内部做了几道把关理解它们能少踩坑资源就绪检查build.js 逐个核对resources/fastapi二进制、LLM 模型元数据、Next.js standalone server、导出任务 runner、export-core 包缺哪个打包前就报哪个避免产出内置服务起不来的坏包。身份解析mas-dev 的身份取PRESENTON_MAS_DEV_IDENTITY没设回退CSC_NAMEbuild.js。mas 的 resolveMasSigningIdentities 会调security find-identity -v读钥匙串里的全部身份依次从PRESENTON_MAS_DISTRIBUTION_IDENTITY、PRESENTON_MAS_IDENTITY、CSC_NAME里取限定词再自动发现匹配的应用 安装包证书对还会把 Apple Development 这类开发身份挡在分发构建之外。临时签名预检分发构建启动前assertCodesignCanUseIdentity 拿选中的身份在一个临时文件上真签一次。超时通常意味着 macOS 在等钥匙串或私钥授权会提示你先解锁登录钥匙串、允许 codesign 访问私钥。平台检查resolveProvisioningProfile 发现不是 darwin 平台时直接抛 MAS builds must be run on macOS because Apple signing tools are required。产物统一落在electron/dist/目录随架构arm64 / x64略有差异大致长这样electron/dist/ mas-dev-arm64/ # 开发签名或未签名的 .app mas-arm64/ # 分发签名的 .app Presenton-version.pkg # MAS 安装包上传 App Store Connect 用 Presenton-version.dmg # 直接分发的签名 公证 DMG把mas出来的.pkg拖进 App Store Connect就能进审核和发布流程了。构建之后测试限制、图标与直接分发路径有几条限制先讲清楚免得你测的时候懵MAS 签名的应用必须用 MAS 的 Electron 构建mas或mas-dev产出来普通 DMG 构建的沙盒兼容性对不上。mas-dev构建只能在你的开发 Profile 注册过的那台 Mac 上运行适合当内测用。mas分发构建通常没法在本地启动它本来就是给 App Store Connect 处理、发布准备的。mas-dev签名带--timestampnonebuild.js 加上masDev.additionalArguments本地签名不碰网络时间戳服务器无网或受限网络下不会卡住。图标默认用的是electron/resources/ui/assets/images/presenton_short_filled.png。想给 App Store 上正式图标把.icns放到electron/build/icon.icns再同步改 build.js 里的mac.icon字段。做图标集要用的源 PNG 在electron/build/icon.iconset/里。如果你不走 App Store、只想出一个签名并公证的 DMG 直接分发跑npm run build:all:mac:signed。它用的是 Developer ID Application 证书加 Apple 公证需要 notarytool 凭据完整流程看 直接分发指南。报错速查看到这句提示该怎么做Missing MAS development/distribution provisioning profileProfile 没放对位置。把正确的.provisionprofile放进electron/build/文件名对不上时 build.js 会列出它期望的候选名。macOS could not decode某个 profile本地这份 Profile 解不开。回 Developer Portal 重新下载替换别把真的提交进 git。Cannot derive an App Store version from package version版本号推不出来。设PRESENTON_APP_STORE_VERSION1.0.0三个点分整数当前 package 带-beta后缀构建mas时这变量必填。MAS builds must be run on macOS你不在 Mac 上。换到装了 Xcode 命令行工具的 Mac 再跑xcode-select --install。FastAPI 或导出二进制在 .app 里不可执行build.js 的afterPack钩子会给打包后的 FastAPI 二进制执行chmod 755补上可执行位并把和目标架构不符的原生 prebuild 目录剪掉。如果之后签名还是失败去查 entitlements 有没有允许沙盒应用执行Contents/Resources/app/resources/下的辅助程序。延伸阅读macOS 开发 README全部 macOS 构建目标的快速参考含npm run dev、npm run build:all和 notarytool profilepresenton-notary的说明。直接分发指南Developer ID 证书、公证、DMG 验证与发布命令。build.js所有 MAS 签名、Profile 校验和资源检查逻辑的源头上面每处行号都指向这里。【免费下载链接】presentonOpen-Source AI Presentation Generator and API (Gamma, Canva, Beautiful AI, Decktopus, Presentations AI Alternative)项目地址: https://gitcode.com/GitHub_Trending/pr/presenton创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?