☰
Presenton 上架 Mac App Store:从开发者证书到 .pkg 的 6 步实操
2026/10/2 8:12:17 网站建设 项目流程

Presenton 上架 Mac App Store:从开发者证书到 .pkg 的 6 步实操

【免费下载链接】presentonOpen-Source AI Presentation Generator and API (Gamma, Canva, Beautiful AI, Decktopus, Presentations AI Alternative)项目地址: https://gitcode.com/GitHub_Trending/pr/presenton

Presenton 是一个开源的 AI 演示文稿生成器,这份指南针对它的 Electron 桌面端做 Mac App Store(MAS)打包:从申请 Apple 开发者证书、放置 provisioning profile,到跑构建脚本、把.pkg上传 App Store Connect 的完整流水线。应用内嵌 Next.js 前端与 FastAPI 后端,全部打进同一个 Electron 壳,因此 MAS 构建必须在装有 Xcode 命令行工具的 macOS 上执行。最终产出两类东西:可提交 App Store 的签名.pkg,以及供注册设备内测的沙盒.app。

一分钟搞清 dmg、mas-dev、mas 三套构建目标

Presenton 在 macOS 上有三套构建目标,全部由PRESENTON_MAC_TARGET环境变量驱动(npm 脚本会自动设置,不用手动 export)。选错目标是后面所有麻烦的源头,先看这张表:

构建目标分发去向签名证书类型是否过 App Store 审核对应 npm 脚本
dmgGitHub Releases、官网等直接下载Developer ID Application不过,改用 Apple 公证(notarization)build:all:mac:signed
mas-dev已注册在开发 profile 里的 MacApple Development不过,用于沙盒内测build:all:mas-dev
masApp Store Connect 上架Apple Distribution(或 3rd Party Mac Developer Application)+ 3rd Party Mac Developer Installer过build:all:mas

几个贯穿全文的关键标识符,都定义在electron/build.js里:Bundle ID 是com.presenton.presenton(APP_ID常量),Team ID 是S6W5C54KL6(TEAM_ID常量,并通过extendInfo.ElectronTeamID写进应用)。如果你用自己的 Bundle ID,Apple 后台创建的 App ID 必须与build.js里的APP_ID保持一致,否则证书、profile 全都对不上。

动手前:在 Apple 后台和仓库里备齐这几样东西

Apple 后台要创建的清单

按顺序在 Apple Developer 侧准备四样东西:

  1. Apple Development 证书:Xcode → Settings → Accounts → 你的团队 → Manage Certificates →+→ 选 Apple Development。它服务于mas-dev构建和本地沙盒测试。
  2. Apple Distribution 证书:同一路径,改选 Apple Distribution。mas构建实际要两张证书:应用证书(Apple Distribution 或 3rd Party Mac Developer Application)加上安装包证书(3rd Party Mac Developer Installer),build.js的身份解析逻辑会同时查找两者,缺一张就直接抛错。
  3. App ID:Developer Portal → Certificates, Identifiers & Profiles → App IDs,新建一个与com.presenton.presenton匹配的 macOS App ID。
  4. 两个 Provisioning Profile:在 Portal → Profiles 各建一个,一个选 macOS App Development(绑 Apple Development 证书),一个选 Mac App Store(绑 Apple Distribution 证书),下载两份.provisionprofile文件备用。

仓库里已经内置好的 MAS 文件

electron/build/目录下已经提交了几份现成文件,不用你碰:

  • entitlements.mas.plist:主应用的沙盒能力声明,管的是"应用能做什么"。其中三个 key 最关键——com.apple.security.app-sandbox是 MAS 硬性要求;com.apple.security.network.client/network.server支撑内嵌的 Next.js 和 FastAPI 本地服务;com.apple.security.cs.allow-jit允许 JIT 编译,Electron 渲染进程离不了它。另外还开放了files.user-selected.read-write和files.downloads.read-write,对应导入文档、导出 PPTX 这类用户主动选文件的操作。
  • entitlements.mas.inherit.plist:辅助进程与内置二进制继承主进程的能力边界,只声明沙盒加com.apple.security.inherit。
  • MacAppStore.provisionprofile.replace_me:占位文件,明确提示这里将来要放你的真实 profile。

需要你自己放进去的 2 个 profile 文件

把从 Portal 下载的两份 profile 存到electron/build/,文件名要能被build.js找到:

  • mas-dev目标:AppleDevelopment.provisionprofile(也接受AppleDev.provisionprofile、AppDev.provisionprofile作为回退名)。
  • mas目标:MacAppStore.provisionprofile(也接受AppDistri.provisionprofile)。

放进仓库不等于万事大吉:build.js在构建前会用security cms -D先解码校验 profile,失败时再回退到openssl cms验证,解码不了就以明确的错误退出,而不是带着坏签名继续打包。下载完可以立刻手动验证一次:

cd electron security cms -D -i build/AppleDevelopment.provisionprofile security cms -D -i build/MacAppStore.provisionprofile

能打印出 profile 内容就说明文件完好。Profile 通常按年过期,过期后重新生成并替换本地文件即可;真实 profile 不要提交进 git,仓库里的replace_me占位文件就是为此设计的。

环境变量与版本号:你大概率会踩的 3 个坑

⚠️ 坑 1:beta 版本号让mas构建直接报错

当前electron/package.json的版本是0.9.11-beta,带-beta后缀。App Store 只接受x.y.z三段式版本号,build.js的校验逻辑是:优先读PRESENTON_APP_STORE_VERSION,格式必须是三个点分整数(1.0.0这类),否则报 "must be three period-separated integers";没设置时尝试从 package 版本号截取数字前缀,截不出来就抛 "Cannot derive an App Store version from package version"。解法是显式指定:

export PRESENTON_APP_STORE_VERSION=1.0.0 export PRESENTON_APP_STORE_BUILD=42

PRESENTON_APP_STORE_BUILD是 build 号,1~3 段点分整数(42或1.0.1都合法),不设时回退用短版本号。

⚠️ 坑 2:签名身份变量名对不上,或者用错了证书

两套目标的身份变量是分开的,别混用:mas-dev读PRESENTON_MAS_DEV_IDENTITY,mas读PRESENTON_MAS_DISTRIBUTION_IDENTITY(别名PRESENTON_MAS_IDENTITY),两者都没设时回退到CSC_NAME,再没有就自动从钥匙串发现。身份值形如Apple Development: Your Name (TEAMID)或Apple Distribution: Your Org (TEAMID)。另一个隐藏规则:分发构建会拒绝Apple Development 这类开发身份,校验逻辑发现你拿开发证书跑mas会直接报错。

⚠️ 坑 3:profile 过期、换机器后构建莫名其妙失败

Profile 绑定了证书和注册设备:mas-dev的 profile 只在注册了该 profile 的 Mac 上能跑,换个没注册的机器就是起不来;mas(分发)构建产物通常也无法在本地启动,它是给 App Store Connect 处理用的。遇到"以前能跑现在不能",第一反应是去 Portal 重新下载 profile 替换electron/build/里的旧文件。

两条构建路径,挑一条走

所有命令都在electron/目录下执行,所有路径都共用同一个前提:首次使用先跑npm run setup:env,它一次性完成npm install、FastAPI 的uv sync、Next.js 依赖安装以及导出运行时和 ImageMagick 的准备。仓库没 clone 的话,先git clone https://gitcode.com/GitHub_Trending/pr/presenton。

如果你要从零构建完整应用

build:all系列会重建 Next.js、FastAPI、导出运行时再打包,是首次构建和正式发布的正路。开发内测跑这条:

PRESENTON_MAS_DEV_IDENTITY="Apple Development: Your Name (TEAMID)" \ npm run build:all:mas-dev

提交 App Store 跑这条(注意带上版本号):

PRESENTON_MAS_DISTRIBUTION_IDENTITY="Apple Distribution: Your Org (TEAMID)" \ PRESENTON_APP_STORE_VERSION=1.0.0 \ npm run build:all:mas

如果你只想重新打包

资源(FastAPI 二进制、Next.js standalone server、导出运行时)已经构建好,只想重跑 electron-builder 打包阶段,用dist:*脚本省时:

PRESENTON_MAS_DEV_IDENTITY="Apple Development: Your Name (TEAMID)" \ npm run dist:mac:mas-dev PRESENTON_MAS_DISTRIBUTION_IDENTITY="Apple Distribution: Your Org (TEAMID)" \ PRESENTON_APP_STORE_VERSION=1.0.0 \ npm run dist:mac:mas

打包前build.js会做资源就绪校验,逐一检查 FastAPI 二进制、LLM 模型元数据、Next.js standalone server、导出任务 runner 与 export-core 包,任何一项缺失都会报错退出,避免产出"装上去但启动不了内置服务"的坏包。

如果你不走 App Store、直接出 DMG

只要一个签名并公证、绕过 App Store 审核的磁盘映像,用 Developer ID 路径:

npm run build:all:mac:signed

这条路径需要 Developer ID Application 证书和公证凭据,具体的一次性配置见下文延伸阅读里的直接分发指南。

📦 产物落在哪、怎么验证

所有产物统一输出到electron/dist/,具体路径随架构(arm64/x64)变化:

electron/dist/ mas-dev-arm64/ # 开发签名的 .app(mas-dev,注册设备上运行) mas-arm64/ # 分发签名的 .app(mas) Presenton-<version>.pkg # 上传 App Store Connect 的 MAS 安装包 Presenton-<version>.dmg # 签名并公证的直接分发 DMG

上传指引一句话:把mas构建产出的.pkg拖进 App Store Connect 就能进入审核与发布流程。至于签名身份,构建脚本会自动读取钥匙串里的身份并先做一次 codesign 预检——如果预检超时,说明 macOS 在等钥匙串/私钥授权,解锁登录钥匙串并允许 codesign 访问对应私钥后重跑即可。

图标与沙盒限制提醒

  • MAS 签名应用必须用 MAS Electron 构建(mas/mas-dev目标)产出,普通 DMG 构建不具备同等的沙盒兼容性。
  • mas-dev构建只能在开发 profile 中注册的 Mac 上运行,适合 TestFlight 式内测。
  • mas-dev签名固定使用--timestamp=none,本地签名不依赖网络时间戳服务,无网或受限网络下不会挂起;需要恢复时间戳时设PRESENTON_CODESIGN_TIMESTAMP=1,PRESENTON_CODESIGN_TIMESTAMP_RETRIES控制重试次数(默认 4)。
  • 打包后签名失败时,检查 entitlements 是否允许沙盒应用执行Contents/Resources/app/resources/下的辅助程序(FastAPI 二进制的可执行权限由afterPack钩子自动设置)。
  • 图标:mac.icon指向electron/build/icon.icns(仓库已内置),生成图标集的源 PNG 在electron/build/icon.iconset/;运行时默认图标是electron/resources/ui/assets/images/presenton_short_filled.png。

遇到报错先查这里

"Missing MAS development/distribution provisioning profile"原因:对应目标找不到可用的 profile 文件。操作:从 Developer Portal 下载并放入electron/build/,文件名用AppleDevelopment.provisionprofile或MacAppStore.provisionprofile。

"macOS could not decode" 某个 profile原因:profile 文件损坏或放的是占位文件。操作:去 Portal 重新下载该 profile 替换本地文件,别把真实 profile 提交进 git。

"Cannot derive an App Store version from package version"原因:package 版本带-beta后缀且没有指定 Store 版本。操作:设置PRESENTON_APP_STORE_VERSION为三段整数,例如1.0.0。

"MAS builds must be run on macOS"原因:Apple 签名工具只能在 macOS 上运行,你在非 Mac 环境执行了构建。操作:换到装有 Xcode 命令行工具的 Mac 上跑(xcode-select --install)。

延伸阅读

  • macOS 开发快速参考:全部 macOS 构建目标速查,含npm run dev直跑、notarytool profilepresenton-notary的说明。
  • macOS 直接分发指南:Developer ID 证书、公证凭据存储、DMG 签名与 Gatekeeper 验证的完整流程。
  • 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询