新闻详情

新闻详情

首页 / 资讯中心 / 详情

Presenton Mac App Store 打包全流程:从证书、Profile 到 .pkg 的 MAS 构建流水线

发布时间:2026/10/2 13:33:39来源:尧图网络
Presenton Mac App Store 打包全流程:从证书、Profile 到 .pkg 的 MAS 构建流水线
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CC Switch 小白入门:用 TaoToken 统一 Key 把国产模型接入 claude code 和 codex 的配置骨架 2026/10/2 15:49:42

CC Switch 小白入门:用 TaoToken 统一 Key 把国产模型接入 claude code 和 codex 的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PlatformIO中ESP32分区表定制实战指南 2026/10/2 15:49:29

PlatformIO中ESP32分区表定制实战指南

1. 为什么必须亲手改ESP32的分区表——PlatformIO里那个被忽略的关键开关在PlatformIO里烧录ESP32,很多人卡在“程序跑不起来”“OTA失败”“Flash空间莫名其妙不够用”“升级后Wi-Fi配置丢失”这些看似玄学的问题上。我带过十几期嵌入式开发训练营,80%的…

阅读更多 →
RAGFlow实战:深度文档理解与Agentic RAG在企业知识库中的落地 2026/10/2 15:49:29

RAGFlow实战:深度文档理解与Agentic RAG在企业知识库中的落地

1. 先聊清楚:为什么我盯上RAGFlow而不是直接调大模型API做企业知识库问答,多数人第一步想到的是把文档丢给大模型API,让它"记住"内容。但真跑过一轮你就会发现,这条路在最关键的落地环节处处卡壳:合同里的金…

阅读更多 →
AI智能体产品开发实战:从脚手架到护城河的工程化路径 2026/10/2 15:49:29

AI智能体产品开发实战:从脚手架到护城河的工程化路径

1. 从 Grok Bot 一个月造出爆款说起:AI 智能体产品的演化逻辑1.1 一个月造出爆款,真正值得关注的不是速度Grok Bot 一个月做出爆款这件事,圈内人第一反应往往是“团队执行力强”或者“踩中了风口”。但如果你真正做过 AI 智能体产品&#xff…

阅读更多 →
RAID卡配置必须在开机自检阶段完成的原因与实操指南 2026/10/2 15:49:29

RAID卡配置必须在开机自检阶段完成的原因与实操指南

1. 项目概述:为什么RAID卡配置必须在开机自检阶段完成? 服务器上按CtrlR进入RAID卡配置界面,这个动作看似简单,实则是一道不可逆的“时间闸门”。它不是操作系统里的软件设置,而是发生在BIOS/UEFI之后、操作系统加载之…

阅读更多 →
大模型安全合规实战:四层架构、提示注入攻防与私有化部署 2026/10/2 15:49:28

大模型安全合规实战:四层架构、提示注入攻防与私有化部署

1. 大模型安全合规的底层逻辑与整体设计思路大模型从实验室走向生产环境,安全与合规从来不是“加个过滤器”那么简单。我在过去两年参与过金融、医疗、政务三个行业的私有化大模型落地项目,踩过的坑比写过的代码还多。这一章我想先把整体设计思路讲清楚&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉