构建MacOS应用小白教程(打包 签名 公证 上架)

embedded/2024/12/21 13:42:15/

打包

package.json中,dependencies会被打进 Electron 应用的包里,而devDependencies则不会,所以必要的依赖需要放到dependencies中。files中定义自己需要被打进 Electron 包里的文件。以下是一个完整的 mac electron-builder的配置文件。

const base = {appId: 'com.xxxx.xxxx', productName: 'Electron 打包模版', // 应用名称,安装后的应用就是名称icon: './media/images/icon.ico',files: [  // 除了package.json中dependencies外,另外需要打包的文件添加到此处'main.js','bundles','updater/win/index.html','updater/build/bootstrap.js','updater/mac/Updater.js','updater/mac/index.html'],publish: { // 需要结合 const { autoUpdater } = require('electron-updater'); 使用provider: 'generic', // 指定服务器类型,generic 通用服务器,也可以是 github 等url: '' // 线上服务器地址},mac: {target: [  // 需要打包出的类型"dmg","zip","pkg","mas"],icon: 'media/images/icon.icns',hardenedRuntime: true,entitlements: 'electron-builder/entitlements.plist',  // 申请可以操作系统权利entitlementsInherit: 'electron-builder/entitlements.plist',provisioningProfile: 'electron-builder/comalibabaslobs.provisionprofile'},pkg: {isRelocatable: false,overwriteAction: "upgrade",},mas: {icon: 'media/images/icon.icns',hardenedRuntime: true,entitlements: 'electron-builder/entitlements.mas.plist',entitlementsInherit: 'electron-builder/entitlements.mas.plist',},dmg: {background: 'media/images/dmg-bg.png',icon: 'media/images/icon.icns',iconSize: 100,sign: false,contents: [ // mac 会有拖动图标安装的过程,这里配置图标的位置、大小、拖动的文件夹{x: 112,y: 165,},{type: 'link',path: '/Applications',x: 396,y: 165,},],},extraMetadata: {  // 打包线上应用,控制变量为 production,此设置会直接在打包的 package.json 中加入 env这个变量,并且把值设置为 production。可以在文件中引用 const pjson = require('./package.json');  此时 pjson.env 等于 'production'env: 'production',}
};module.exports = base;

签名

  • Electron 签名 & 认证 macOS 版本 官方文档
  • 苹果开发者申请证书地址

MacOS 10.15 之前,应用如果没有进行签名,首次打开的时候就会出现“恶意软件”提示。

1. 加入开发者

加入 Apple Developer Program(需要缴纳年费)

如果是管理员,会看到可以申请 Developer ID Application,如果不是管理员就会像我这种,看到是灰色的。Electron 打包是需要用这个身份生成证书的。

2. 生成签名证书

如果有管理员权限,点击生成新的证书。

Choose File 里面的文件从哪里来?打开 mac 的钥匙串访问 -> 证书助理 -> 从证书颁发机构请求证书,这里生成了 CertificateSigningRequest.certSigningRequest 的文件,这个文件可以被多次用来生成 mac 证书。

填写必要信息,用户邮箱填写你的 app开发者邮箱,常用名称随便取一个,然后选择保存到本地磁盘。

3. 安装签名证书

上次文件后就生成证书了,下载证书安装。如果出现了次证书不受信任的情况,在列表中双击证书,将使用此证书时更改为始终信任。

如果安装的证书不对,会出现 Command failed: codesign ...

4. 证书导出 p12 给其它人使用

在 mac 的钥匙串访问中,找到证书,然后 右键 -> 导出证书,一般导出 .p12 形式,然后输入证书安装的密码。其它人拿着你的证书,告诉他安装密码即可安装。

5. 不要 Developer ID Application 签名证书,不影响 Electron 应用打包

在打包过程中,找不到 Developer ID Application 签名证书的情况下,会跳过处理。但是应用不签名和公证会影响electron-autoupdater 自动更新能下载无法打开,用户首次打开会提示恶意软件,应用无法上架到appStore。

公证

MacOS 10.14.5 之后,应用如果没有进行公证(将安装包上传到 Apple 审查),首次打开的时候就会出现更严重的“恶意软件”提示。没有进行过公证也无法上传到 Apple Store 中提供给其他人下载。

代码公证 

const { notarize } = require('electron-notarize');
notarize({appPath: '',          // 应用的路径 xxx.app 结尾的 appBundleId: '',      // appidappleId: '',          // 苹果开发者 idappleIdPassword: '',  // 应用专用密码ascProvider: ''       // 证书提供者
})
  • appPath打包后应用的路径,.app 或者 .dmg 结尾。

  • appBundleId 跟 Electron-builder 配置的 appId 一致,这个 appId 要妥善命名。不要发布应用以后再修改,不然会导致应用无法自动更新。比较好的命名一般都是 com.xxx(公司名).xxx(应用英文名)

  1. 苹果开发者的账号 appleId,填写自己的开发者id 就可以,确保自己是属于开发者。应用专用密码 appleIdPassword,登录 appleid.apple.com/account/man…

这个密码生成后只会出现一次,之后再也没办法看到,所有请保存下来。如果忘记了密码,就重新创建一个,为方便管理不用的密码进行删除后重新创建比较合适。

 

  1. ascProvider 证书的提供者,通过 mac 钥匙串访问查看。你所有使用的签名证书,括号里面的就是证书提供者。
  2. 公证会把程序压缩包上传到 apple 服务器,保证网络通畅。公证成功后,开发者邮箱会收到邮件。
  3. notarize {}后面是绝对的json结构,不要出现这些是单引号的情况,不然会报错。 appPathappBundleIdappleIdPasswordascProvider

命令行工具公证

需要下载 xcode

  1. 一句话命令公证
    xcrun altool --notarize-app --primary-bundle-id "com.xxx.xxx" --username "your developer appleid" --password "appleId-password" --asc-provider "ProviderShortname" -t osx --file xxx.dmg
    

 

2.ascProvider 证书的提供者命令行查询

xcrun altool --list-providers -u "apple id" -p "appleIdPassword(应用专用密码)”

3. 公证成功后

No errors uploading 'xxxxxxx-xxxx.dmg'.
RequestUUID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

上架 AppStore 商店

Electron 应用如果要能发到 appStore,需要 electron-builder 构建 mas(Mac应用商店),经过签名公证后上传到 app store connect,上传之前应用需要支持sandbox。

注册AppId

在 electron-builder 配置的 appId,无论写什么我们都是可以打包配置成功的,因为不涉及到发到 appStore。如果需要发到 appStore,就需要到 apple 开发者官网中去申请一个正式的了。

https://juejin.cn/post/7009179524520738824 


http://www.ppmy.cn/embedded/147543.html

相关文章

STM32单片机芯片与内部33 ADC 单通道连续DMA

目录 一、ADC DMA配置——标准库 1、ADC配置 2、DMA配置 二、ADC DMA配置——HAL库 1、ADC配置 2、DMA配置 三、用户侧 1、DMA开关 (1)、标准库 (2)、HAL库 2、DMA乒乓 (1)、标准库 &#xff…

uniapp scroll-view 不生效排查

排查路径&#xff1a; 开启 refresher-enabled 属性使用竖向滚动时&#xff0c;需要给 <scroll-view> 一个固定高度&#xff0c;通过 css 设置 height&#xff1b;使用横向滚动时&#xff0c;需要给 <scroll-view> 添加 white-space: nowrap; 样式父元素不要设置 …

spring学习(XML中定义与配置bean(超详细)。IoC与DI入门spring案例)

目录 一、配置文件(XML)中定义与配置bean。 &#xff08;1&#xff09;bean的基础配置。&#xff08;id、class&#xff09; &#xff08;2&#xff09;bean的别名配置。 1、基本介绍。 2、demo测试。 3、NoSuchBeanDefinitionException&#xff01; &#xff08;3&#xff09;…

最大子数组和 最大子数组和(有长度限制) 最大m段子数组和

1.最大子数组和 可以用dp求解,只需要维护一个sum表示目前为止的最大子数组,遇到num[i]时若sum > 0则sum可以继续作为子数组更新sum为sum num[i]否则sum更新为num[i] 2.最大子数组和(有长度限制) 135. 最大子序和 - AcWing题库 要求长度不超过m的子数组,首先求出原数组的…

基于注意力机制的faster-rcnn算法的目标检测(源码+pytorch框架)

需要完整代码和数据集请私信或评论 网络架构设计 基于注意力机制的R-CNN网络架构在传统Faster R-CNN基础上进行了创新性改进,特别融入了卷积注意力模块(CBAM),旨在提升模型对关键特征的捕获能力和整体检测性能。这种设计巧妙地结合了注意力机制的优势,有效增强了模型对目标…

python实现word转html

目录 使用mammoth库 使用spire.doc库 使用mammoth库 mammoth库支持将word转为HTML和markdown格式的文件。 import mammothdef word_html(word_file):html_save_name fr{word_file.split(.)[0]}.htmlwith open(word_file, rb) as f:data mammoth.convert_to_html(f)with o…

数据挖掘与机器学习(part 9) 规则挖掘Rules Mining关联规则(Association Rules) Apriori算法

基于规则的分类器&#xff1a;Classification using rule based classifier 互斥规则&#xff08;Mutually exclusive rules&#xff09;&#xff1a; 分类器包含互斥规则&#xff0c;如果这些规则彼此独立。 每条记录最多被一条规则覆盖。 穷尽规则&#xff08;Exhaustive …

VarifocalLoss在Yolov8中的应用

调用VFL Loss 在ultralytics/utils/loss.py可以发现v8实现了VarifocalLoss&#xff0c;但是好像和原论文有点不一样&#xff0c;这里有待考证原文地址&#xff1a;论文在cls损失处 # Cls lossloss[1] self.varifocal_loss(pred_scores, target_scores, target_labels) / targ…