当前位置: 首页 > article >正文

Mac Electron 应用签名与公证全流程指南:从零到发布

1. 为什么Mac Electron应用需要签名和公证最近几年越来越多的开发者发现自己开发的Mac Electron应用在用户电脑上无法正常运行。最常见的情况是用户双击应用时系统弹出警告提示无法打开应用因为无法验证开发者。这种情况在macOS 10.14.5及更高版本中尤为常见。苹果从macOS 10.14.5开始引入了更严格的安全机制。简单来说所有在Mac上运行的应用程序都需要经过两道安全验证签名和公证。签名相当于开发者的数字身份证证明这个应用确实是你开发的公证则是把应用提交给苹果进行安全扫描确保应用不包含恶意代码。很多开发者尝试让用户通过终端命令sudo spctl --master-disable来绕过安全验证但这并不是个好办法。首先普通用户可能根本找不到终端在哪里其次让用户输入sudo命令存在安全风险最重要的是这种做法违背了苹果的安全设计初衷。正确的做法是老老实实走完签名和公证流程。2. 准备工作获取开发者账号和证书2.1 注册苹果开发者账号签名和公证都需要苹果开发者账号。如果你还没有账号需要先到苹果开发者网站注册。个人开发者账号年费是99美元公司账号也是同样的价格但需要提供额外的公司信息。注册完成后登录开发者账号进入Certificates, Identifiers Profiles页面。这里是我们后续操作的主要场所。2.2 创建证书签名请求(CSR)在生成开发者证书之前我们需要先在本地Mac上创建一个证书签名请求(CSR)文件打开钥匙串访问应用可以在Spotlight搜索顶部菜单选择钥匙串访问 证书助理 从证书颁发机构请求证书...填写你的邮箱地址建议使用开发者账号邮箱选择存储到磁盘点击继续保存为CertificateSigningRequest.certSigningRequest文件这个CSR文件包含了你的公钥信息苹果会用这个文件来验证你的身份。2.3 生成Developer ID Application证书现在回到苹果开发者网站进入Certificates页面点击按钮添加新证书选择Developer ID Application类型上传刚才生成的CSR文件下载生成的证书文件.cer格式下载完成后双击证书文件会自动安装到钥匙串中。在钥匙串访问应用中选择登录钥匙串然后在我的证书分类下就能看到新安装的证书。3. 应用签名全流程3.1 准备签名材料签名需要三个关键材料开发者证书上一步已经安装到钥匙串私钥生成CSR时自动创建应用标识符App Bundle Identifier首先我们需要把证书和私钥导出为.p12文件在钥匙串访问中找到你的开发者证书右键点击选择导出...选择.p12格式设置一个密码保存文件到安全位置3.2 配置Electron打包环境Electron应用的签名是在打包过程中完成的。我们需要配置一些环境变量export CSC_LINKfile:///path/to/your/certificate.p12 export CSC_KEY_PASSWORDyour_p12_password export APPLE_IDyour_apple_idemail.com export APPLE_ID_PASSWORDyour_app_specific_password注意APPLE_ID_PASSWORD不是你的Apple ID密码而是需要在苹果账号设置中生成的应用专用密码。3.3 使用electron-builder打包签名推荐使用electron-builder进行打包和签名。在package.json中添加如下配置build: { appId: com.yourcompany.yourapp, mac: { category: public.app-category.developer-tools, target: dmg, hardenedRuntime: true, gatekeeperAssess: false, entitlements: build/entitlements.mac.plist, entitlementsInherit: build/entitlements.mac.plist } }然后运行打包命令electron-builder --mac如果一切顺利你会在输出目录下看到签名后的.dmg或.pkg文件。可以通过以下命令验证签名是否成功codesign -dv --verbose4 /path/to/your.app4. 应用公证详细步骤4.1 公证工具变迁苹果的公证工具经历了多次变更。早期使用的是altool现在已经完全弃用。目前唯一支持的公证工具是notarytool它集成在Xcode命令行工具中。确保你已经安装了最新版Xcode命令行工具xcode-select --install4.2 提交公证申请使用以下命令提交公证申请xcrun notarytool submit YourApp.zip \ --apple-id your_apple_idemail.com \ --password your_app_specific_password \ --team-id your_team_id \ --wait参数说明YourApp.zip需要公证的应用包apple-id你的Apple IDpassword应用专用密码team-id可以在苹果开发者账号的Membership页面找到--wait等待公证完成可选4.3 检查公证状态提交后可以通过以下命令检查状态xcrun notarytool history \ --apple-id your_apple_idemail.com \ --password your_app_specific_password \ --team-id your_team_id公证通常需要5-30分钟。状态变化如下In Progress正在处理Accepted公证成功Invalid公证失败会提供失败原因4.4 处理公证失败如果公证失败可以通过以下命令查看详细日志xcrun notarytool log submission_id \ --apple-id your_apple_idemail.com \ --password your_app_specific_password \ --team-id your_team_id常见失败原因包括签名无效或不完整使用了过时的依赖库应用包含不允许的权限声明网络问题导致上传不完整5. 公证后的必要操作5.1 添加票据到应用公证成功后需要将公证票据(stapled ticket)附加到应用包上xcrun stapler staple YourApp.app这一步很重要它让应用在没有网络连接的情况下也能验证公证状态。5.2 最终验证完成所有步骤后建议进行完整验证spctl -a -v YourApp.app如果输出中包含accepted和notarized字样说明一切正常。5.3 分发应用现在你的应用可以分发给用户了。常见的分发方式包括直接提供.dmg或.pkg下载通过网站分发使用Sparkle等自动更新框架提交到Mac App Store需要额外的审核流程6. 常见问题与解决方案6.1 签名验证失败错误信息示例code object is not signed at all解决方案确认打包时确实执行了签名步骤检查CSC_LINK和CSC_KEY_PASSWORD环境变量设置正确尝试清理并重新打包rm -rf node_modules npm install npm run build6.2 公证被拒绝常见原因应用包含过时的依赖特别是原生模块权限声明(entitlements)配置不当解决方案更新所有依赖到最新版本检查entitlements.plist文件确保只声明必要的权限确保应用不尝试访问沙盒外的资源6.3 应用启动崩溃有时签名和公证都成功了但应用启动时崩溃。这通常是因为应用尝试访问受限资源如摄像头、麦克风但没有声明相应权限使用了不兼容的Electron版本原生模块没有正确签名调试方法查看系统日志console.app在终端中运行应用查看错误输出尝试禁用沙盒测试是否是权限问题7. 自动化与持续集成手动执行签名和公证流程很繁琐特别是需要频繁更新的应用。建议将流程自动化7.1 使用GitHub Actions示例workflow配置name: Build and Notarize on: push jobs: build: runs-on: macos-latest steps: - uses: actions/checkoutv2 - name: Install Node.js uses: actions/setup-nodev1 with: node-version: 14 - name: Install dependencies run: npm install - name: Build run: npm run build env: CSC_LINK: ${{ secrets.CSC_LINK }} CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} APPLE_ID: ${{ secrets.APPLE_ID }} APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} TEAM_ID: ${{ secrets.TEAM_ID }} - name: Notarize run: | xcrun notarytool submit dist/*.zip \ --apple-id $APPLE_ID \ --password $APPLE_ID_PASSWORD \ --team-id $TEAM_ID \ --wait7.2 使用CircleCI类似地可以在CircleCI配置中添加签名和公证步骤。关键是确保CI环境能够访问证书文件和密码。8. 进阶技巧与最佳实践8.1 多架构支持随着Apple Silicon的普及建议同时支持x86_64和arm64架构build: { mac: { target: [dmg, zip], arch: [x64, arm64] } }8.2 加速公证流程公证通常需要等待以下方法可以加速尽量减小应用体积提前上传应用可以在最终构建前先传一个空壳使用--wait参数自动等待完成8.3 处理原生模块如果应用包含原生模块如node-sqlite3需要确保模块已经针对目标架构编译模块本身已正确签名在entitlements中声明必要的权限8.4 沙盒配置如果应用需要访问沙盒外资源需要仔细配置entitlements文件。示例?xml version1.0 encodingUTF-8? !DOCTYPE plist PUBLIC -//Apple//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd plist version1.0 dict keycom.apple.security.cs.allow-unsigned-executable-memory/key true/ keycom.apple.security.cs.disable-library-validation/key true/ keycom.apple.security.device.camera/key true/ keycom.apple.security.device.microphone/key true/ /dict /plist在实际项目中我发现最常遇到的问题往往与权限声明有关。特别是当应用需要访问摄像头、麦克风或者某些特殊目录时一定要在entitlements文件中明确声明。有一次我们花了整整两天时间排查一个启动崩溃问题最后发现只是因为忘记声明麦克风访问权限。

相关文章:

Mac Electron 应用签名与公证全流程指南:从零到发布

1. 为什么Mac Electron应用需要签名和公证? 最近几年,越来越多的开发者发现,自己开发的Mac Electron应用在用户电脑上无法正常运行。最常见的情况是用户双击应用时,系统弹出警告提示"无法打开应用,因为无法验证开…...

CRNN实战避坑指南:用你自己的数据集训练一个身份证/票据文字识别模型

CRNN实战避坑指南:用你自己的数据集训练一个身份证/票据文字识别模型 在金融、政务、医疗等行业中,身份证、发票、票据等文档的自动化识别一直是刚需。传统OCR方案在面对复杂版式、模糊拍摄或特殊字体时往往力不从心。本文将手把手带您实现一个基于CRNN的…...

从QImage到QPixmap:深入理解Qt图片处理核心类,打造流畅自适应的图片展示控件

从QImage到QPixmap:深入理解Qt图片处理核心类,打造流畅自适应的图片展示控件 在开发图形界面应用时,图片展示是最基础却也是最容易遇到性能瓶颈的功能之一。很多开发者都曾遇到过这样的场景:当我们需要在界面中显示一张图片时&…...

移动端架构演进历程解析

移动端架构演进历程解析 移动互联网的快速发展推动了移动端架构的不断演进。从早期的简单MVC模式到如今的模块化、组件化架构,每一次变革都伴随着性能优化、开发效率提升和用户体验改善。本文将解析移动端架构的演进历程,帮助开发者理解技术背后的逻辑&…...

2025年03月CCF-GESP编程能力等级认证Python编程六级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 在面向对象编程中,类是一种重要的概念。下面关于类的描述中,不正确的是 ( )。 A. 类是一个抽象的概念,用于描述具有相…...

LlamaFactory-webui保姆级教程:从零开始训练你的第一个大语言模型(附避坑指南)

LlamaFactory-webui保姆级教程:从零开始训练你的第一个大语言模型(附避坑指南) 当你第一次听说"大语言模型"这个词时,可能会觉得这是只有科技巨头才能玩转的高端技术。但今天,我要告诉你一个好消息&#xff…...

Vue项目中天地图动态标注的添加与删除实践

1. 天地图与Vue结合的基础准备 在Vue项目中使用天地图API前,需要先完成基础的环境配置。我推荐使用npm安装天地图JavaScript API的方式,这样能更好地与现代前端工程化开发流程结合。首先在项目中执行: npm install tdt-map安装完成后&#xf…...

联邦卡尔曼滤波与分布式滤波在雷达多传感器轨迹估计中的性能对比与优化策略

1. 多传感器轨迹估计的技术挑战与需求 想象一下你正在指挥一个由多部雷达组成的防空系统,每部雷达都在追踪同一架飞机的轨迹。这些雷达分布在不同位置,有的在山顶,有的在海岸线,还有的在移动平台上。每部雷达都会产生带有噪声的测…...

从加权平均到多项式拟合:局部加权回归的进阶之路

1. 从加权平均到局部回归:理解核平滑的本质 我第一次接触核平滑方法时,被它优雅的数学形式深深吸引。想象你是一位气象学家,手头有一堆散乱的气温观测数据,想要绘制一条平滑的气温变化曲线。传统方法可能会对所有数据点一视同仁&a…...

K8s Kustomize介绍(Kubernetes官方声明式配置管理工具,通过叠加overlay方式定制资源)kubectl内置、Patch补丁机制、GitOps

文章目录 Kustomize 入门与实践指南:Kubernetes 原生配置管理利器一、什么是 Kustomize?二、为什么需要 Kustomize?三、核心概念1. Base(基础配置)2. Overlay(覆盖层)3. kustomization.yaml&…...

PCB接地设计

接地模拟小信号地和功率地必须分开。原则上功率地在顶层挨在一起放置(图8的左图),如果分割PGND而通过过孔在背面或内层连接的话(图8的右图),受过孔的寄生电阻和寄生电感的影响,可能会出现损耗增…...

三菱FX5U Socket通信避坑指南:被动模式下的5个常见错误与稳定连接秘诀

三菱FX5U Socket通信避坑指南:被动模式下的5个常见错误与稳定连接秘诀 在工业自动化领域,稳定可靠的通信是生产线持续运行的生命线。三菱FX5U系列PLC凭借其强大的以太网Socket通信能力,成为众多工程师的首选。然而,在实际应用中&a…...

新服务器上线优化调整

1. 写入到系统配置 重新登录终端生效配置&#xff0c;只对使用二进制启动的进程生效&#xff0c;对于使用systemd管理的进程不生效&#xff0c;已经运行的进程不生效。 cat >> /etc/security/limits.conf << EOF # 限制用户能打开的进程数 * soft nproc 1000000 * …...

Android音频开发避坑指南:搞懂AudioTrack的MODE_STATIC与MODE_STATIC内存模型差异

Android音频开发深度解析&#xff1a;AudioTrack的MODE_STATIC与MODE_STREAM内存模型实战对比 在移动端音频应用开发中&#xff0c;性能优化始终是工程师们需要直面的挑战。当你在开发一款高要求的音乐播放器或游戏音效系统时&#xff0c;是否遇到过音频播放延迟、内存占用异常…...

HFSS实战指南:从零到一完成矩形贴片微带天线参数化调优

1. HFSS与微带天线设计基础 刚接触HFSS时&#xff0c;我也曾被它复杂的界面吓到过。但用熟后发现&#xff0c;这简直就是射频工程师的"瑞士军刀"。就拿最常见的矩形贴片微带天线来说&#xff0c;用HFSS做参数化调优&#xff0c;效率比手工计算高太多了。先说说这个天…...

科学计算器统计功能实战:从基础操作到概率论应用

1. 科学计算器统计功能入门指南 第一次接触科学计算器的统计功能时&#xff0c;我被那一排排按键搞得晕头转向。记得大学概率论课上&#xff0c;教授突然说"现在请大家用计算器计算这组数据的标准差"&#xff0c;整个教室顿时响起此起彼伏的按键声和叹气声。如果你也…...

科研利器t-SNE降维实战:从特征可视化到深度学习模型诊断,一文掌握核心技巧!

1. 为什么t-SNE是科研可视化神器 第一次看到t-SNE生成的彩色散点图时&#xff0c;我正盯着屏幕上那团像星云般聚集的数据点发呆。那是我处理了三个月的基因表达数据&#xff0c;在PCA降维后依然像打翻的颜料盘&#xff0c;而t-SNE只用了几行代码就让不同癌症亚型自动分成了泾渭…...

Eye-in-Hand还是Eye-to-Hand?机器人视觉抓取中九点标定的选择与实战避坑

Eye-in-Hand还是Eye-to-Hand&#xff1f;机器人视觉抓取中九点标定的工程化选择 在自动化生产线调试现场&#xff0c;机械臂工程师小李盯着屏幕上飘忽不定的定位误差发愁——同样的九点标定流程&#xff0c;上周测试时精度还能控制在0.3mm以内&#xff0c;今天却突然漂移超过1m…...

保姆级教程:在Deepin/UOS上用DTK(Qt5)开发你的第一个桌面应用

零基础实战&#xff1a;在Deepin/UOS上使用DTK开发桌面应用全指南 从零开始搭建DTK开发环境 Deepin操作系统自带的DTK&#xff08;Deepin Tool Kit&#xff09;是一套基于Qt5的深度定制UI组件库&#xff0c;能让开发者快速构建符合Deepin/UOS统一风格的应用程序。对于刚接触这个…...

如何让8大网盘下载速度提升300%?解锁LinkSwift的下载新体验

如何让8大网盘下载速度提升300%&#xff1f;解锁LinkSwift的下载新体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…...

51单片机核心板PCB设计避坑指南:嘉立创EDA专业版实战(附免费打样尺寸秘诀)

51单片机核心板PCB设计避坑指南&#xff1a;嘉立创EDA专业版实战解析 第一次用嘉立创EDA专业版画51单片机核心板时&#xff0c;我盯着DRC检查列表里密密麻麻的警告发愣——明明跟着教程一步步操作&#xff0c;为什么还会出现这么多潜在问题&#xff1f;后来才发现&#xff0c;…...

SpeedAI科研小助手:论文查重降AIGC率一站式通关神器

一、论文人共同焦虑&#xff1a;重复率飙红、AI率超标&#xff0c;踩坑踩麻了 凌晨两点的实验室、宿舍书桌前&#xff0c;你盯着查重报告上刺眼的60%重复率&#xff0c;再看AIGC检测结果里98%的疑似度&#xff0c;只觉得毕业答辩的门槛好像瞬间高了好几倍。 是不是也踩过这些坑…...

STM32 TIM定时器PWM实战:从呼吸灯到舵机控制,一个定时器搞定三个项目

STM32 TIM定时器PWM实战&#xff1a;从呼吸灯到舵机控制&#xff0c;一个定时器搞定三个项目 在嵌入式开发中&#xff0c;PWM&#xff08;脉冲宽度调制&#xff09;技术就像一把瑞士军刀&#xff0c;它能让你用简单的数字信号控制各种模拟设备。想象一下&#xff0c;你手头只有…...

让你的10美元鼠标秒变苹果触控板!Mac Mouse Fix终极使用指南

让你的10美元鼠标秒变苹果触控板&#xff01;Mac Mouse Fix终极使用指南 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 还在为macOS上的鼠标体…...

【最后72小时解锁权限】:2026奇点大会AI对话机器人Benchmark基准测试平台访问密钥(含OpenChatBench v3.1、C-DialEval 2026、中文司法对话挑战集)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AI对话机器人 2026奇点智能技术大会(https://ml-summit.org) 本届大会聚焦于对话式AI的范式跃迁——从任务导向型助手迈向具备持续记忆、跨轮次意图推理与多模态语境感知的“共生智能体”。核心展示平台基于开源框架Conve…...

【AI隐私计算新范式】:联邦学习+差分隐私+可信执行环境(TEE)三位一体架构实测报告

第一章&#xff1a;生成式AI应用数据隐私保护 2026奇点智能技术大会(https://ml-summit.org) 生成式AI在内容创作、代码生成、客服对话等场景中爆发式落地&#xff0c;但其训练与推理过程常涉及敏感用户数据的输入、缓存与输出&#xff0c;引发隐私泄露、数据残留和模型反演等…...

计算机视觉 --- 图像去噪与增强:模糊算法的艺术与科学

1. 图像模糊的双面魔法&#xff1a;降噪与特征增强 第一次接触图像模糊技术时&#xff0c;我和大多数人一样疑惑&#xff1a;把图片变模糊有什么用&#xff1f;直到在医疗影像项目里看到CT扫描图上那些雪花点般的噪声&#xff0c;才明白这个看似简单的操作背后藏着多少门道。想…...

C#实现ModbusRTU详解【六】—— NModbus4报文读写

1. 为什么需要直接操作ModbusRTU底层报文 在工业自动化项目中&#xff0c;ModbusRTU协议因其简单可靠被广泛应用。NModbus4库提供了ReadCoils、WriteSingleRegister等高层API&#xff0c;确实能快速实现基础功能。但实际开发中&#xff0c;我遇到过三种必须操作底层报文的典型场…...

PowerDNS+MySQL实战:5步搞定内网DNS高可用部署(附避坑指南)

PowerDNSMySQL企业级内网DNS高可用架构设计与实战 当企业内网规模突破千台设备时&#xff0c;"ping不通服务器"这类基础问题往往成为IT团队的噩梦。传统hosts文件维护早已力不从心&#xff0c;而公有云DNS服务又无法满足内网隔离需求。这正是我们三年前遇到的困境——…...

如何快速搭建Windows C/C++开发环境:MinGW-w64终极配置指南

如何快速搭建Windows C/C开发环境&#xff1a;MinGW-w64终极配置指南 【免费下载链接】mingw-w64 (Unofficial) Mirror of mingw-w64-code 项目地址: https://gitcode.com/gh_mirrors/mi/mingw-w64 你是否想在Windows系统上开启专业的C/C编程之旅&#xff0c;但又苦于找…...