新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/2 8:12:20来源:尧图网络
Presenton 上架 Mac App Store:从开发者证书到 .pkg 的 6 步实操
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/presentonPresenton 是一个开源的 AI 演示文稿生成器这份指南针对它的 Electron 桌面端做 Mac App StoreMAS打包从申请 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 公证notarizationbuild:all:mac:signedmas-dev已注册在开发 profile 里的 MacApple Development不过用于沙盒内测build:all:mas-devmasApp Store Connect 上架Apple Distribution或 3rd Party Mac Developer Application 3rd Party Mac Developer Installer过build:all:mas几个贯穿全文的关键标识符都定义在electron/build.js里Bundle ID 是com.presenton.presentonAPP_ID常量Team ID 是S6W5C54KL6TEAM_ID常量并通过extendInfo.ElectronTeamID写进应用。如果你用自己的 Bundle IDApple 后台创建的 App ID 必须与build.js里的APP_ID保持一致否则证书、profile 全都对不上。动手前在 Apple 后台和仓库里备齐这几样东西Apple 后台要创建的清单按顺序在 Apple Developer 侧准备四样东西Apple Development 证书Xcode → Settings → Accounts → 你的团队 → Manage Certificates →→ 选 Apple Development。它服务于mas-dev构建和本地沙盒测试。Apple Distribution 证书同一路径改选 Apple Distribution。mas构建实际要两张证书应用证书Apple Distribution 或 3rd Party Mac Developer Application加上安装包证书3rd Party Mac Developer Installerbuild.js的身份解析逻辑会同时查找两者缺一张就直接抛错。App IDDeveloper Portal → Certificates, Identifiers Profiles → App IDs新建一个与com.presenton.presenton匹配的 macOS App ID。两个 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 个坑⚠️ 坑 1beta 版本号让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_VERSION1.0.0 export PRESENTON_APP_STORE_BUILD42PRESENTON_APP_STORE_BUILD是 build 号1~3 段点分整数42或1.0.1都合法不设时回退用短版本号。⚠️ 坑 2签名身份变量名对不上或者用错了证书两套目标的身份变量是分开的别混用mas-dev读PRESENTON_MAS_DEV_IDENTITYmas读PRESENTON_MAS_DISTRIBUTION_IDENTITY别名PRESENTON_MAS_IDENTITY两者都没设时回退到CSC_NAME再没有就自动从钥匙串发现。身份值形如Apple Development: Your Name (TEAMID)或Apple Distribution: Your Org (TEAMID)。另一个隐藏规则分发构建会拒绝Apple Development 这类开发身份校验逻辑发现你拿开发证书跑mas会直接报错。⚠️ 坑 3profile 过期、换机器后构建莫名其妙失败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_IDENTITYApple Development: Your Name (TEAMID) \ npm run build:all:mas-dev提交 App Store 跑这条注意带上版本号PRESENTON_MAS_DISTRIBUTION_IDENTITYApple Distribution: Your Org (TEAMID) \ PRESENTON_APP_STORE_VERSION1.0.0 \ npm run build:all:mas如果你只想重新打包资源FastAPI 二进制、Next.js standalone server、导出运行时已经构建好只想重跑 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: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/ # 开发签名的 .appmas-dev注册设备上运行 mas-arm64/ # 分发签名的 .appmas 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签名固定使用--timestampnone本地签名不依赖网络时间戳服务无网或受限网络下不会挂起需要恢复时间戳时设PRESENTON_CODESIGN_TIMESTAMP1PRESENTON_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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

FormData多文件上传的底层原理与实战避坑指南 2026/10/2 10:32:39

FormData多文件上传的底层原理与实战避坑指南

1. 这不是“加几个字段”那么简单&#xff1a;FormData多文件上传的真实复杂度你可能已经试过用new FormData()把几个<input type"file" multiple>选中的文件塞进去&#xff0c;再append(username, zhangsan)加个用户名&#xff0c;最后fetch(/upload, { metho…

阅读更多 →
WorkBuddy 深度解析:AI Agent 工作台从安装配置到 Skill 实战 2026/10/2 10:32:39

WorkBuddy 深度解析:AI Agent 工作台从安装配置到 Skill 实战

1. 为什么我劝你先搞清楚 WorkBuddy 到底是个什么东西第一次打开 WorkBuddy 的时候&#xff0c;我承认我有点懵。界面上东西不多&#xff0c;一个对话框&#xff0c;左边一排图标&#xff0c;看起来跟市面上那些聊天工具没什么本质区别。但真正用起来才发现&#xff0c;这东西的…

阅读更多 →
Jetpack Compose 预览完全指南:从原理到最佳实践 2026/10/2 10:32:39

Jetpack Compose 预览完全指南:从原理到最佳实践

看到“Compose 预览”这个需求&#xff0c;先别急着往 Docker Compose 上想&#xff0c;在 Android 开发这个语境里&#xff0c;它指的是 Jetpack Compose 的 UI 预览能力。简单说&#xff0c;就是不用跑模拟器、不用连真机&#xff0c;直接在 Android Studio 里把 Composable …

阅读更多 →
YOLOv8改进算法实战:垃圾分类识别全流程解析 2026/10/2 10:32:38

YOLOv8改进算法实战:垃圾分类识别全流程解析

这个选题我太熟了&#xff0c;垃圾分类识别在目标检测里属于典型的“工业界急用、学术界能做文章”的方向。标题里三个关键词——深度学习、YOLOv8、改进算法——基本就框死了技术路线和实现方案。我按自己做过的类似项目经验&#xff0c;把这个课题从思路拆解到部署落地完整捋…

阅读更多 →
FormData多文件上传原理与实战:HTTP multipart协议深度解析 2026/10/2 10:32:38

FormData多文件上传原理与实战:HTTP multipart协议深度解析

1. 这不是“加几个文件”那么简单&#xff1a;FormData多文件上传的本质是数据组织方式的重构你有没有遇到过这样的场景&#xff1a;前端要提交一个带封面图、多张产品图、PDF说明书&#xff0c;还要附带商品名称、分类ID、是否上架、创建人邮箱——这四个字段里&#xff0c;三…

阅读更多 →
ModelSim vsim-3033模块未定义排查:库映射与编译顺序 2026/10/2 10:32:24

ModelSim vsim-3033模块未定义排查:库映射与编译顺序

很多人在跑 ModelSim 仿真时都遇到过这样一行提示&#xff1a;Error: (vsim-3033) ... Instantiation of xxx failed. The design unit was not found.&#xff0c;或者更直接一点的Module XXXX is not defined。第一次看到它的人往往会先去怀疑代码语法&#xff0c;把对应的 .…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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