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

打包

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: '',      // appid
  appleId: '',          // 苹果开发者 id
  appleIdPassword: '',  // 应用专用密码
  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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flink sink doris

接上文&#xff1a;一文说清flink从编码到部署上线 网上关于flink sink drois的例子较多&#xff0c;大部分不太全面&#xff0c;故本文详细说明&#xff0c;且提供完整代码。 1.添加依赖 <!--doris cdc--><!-- 参考&#xff1a;"https://doris.apache.org/zh-C…

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT&#xff08;Transient Execution &#xff09;Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…

【STM32 Modbus编程】-作为主设备写入多个线圈和寄存器

作为主设备写入多个线圈和寄存器 文章目录 作为主设备写入多个线圈和寄存器1、硬件准备与连接1.1 RS485模块介绍1.2 硬件配置与接线1.3 软件准备2、写入多个线圈2.1 数据格式2.2 发送数据2.3 结果3、写入多个寄存器3.1 数据格式3.2 发送数据3.3 结果本文将实现STM32作为ModBus主…

国标GB28181协议平台Liveweb:搭建建筑工地无线视频联网监控系统方案

随着科技高速发展&#xff0c;视频信号经过数字压缩&#xff0c;通过互联网宽带或者移动4G网络传递&#xff0c;可实现远程视频监控功能。将这一功能运用于施工现场安全管理&#xff0c;势必会大大提高管理效率&#xff0c;提升监管层次。而这些&#xff0c;通过Liveweb监控系统…

AS-REP Roasting离线爆破攻击

针对一个域内用户&#xff0c;其账户选项有个设置叫作 “不要求 kerberos 预身份验证”&#xff0c;它默认是关闭的。 当 “不要求 kerberos 预身份验证” 选项被勾选&#xff0c;会出现以下效果&#xff1a; as-req 报文中不需要添加用户 hash 加密的时间戳&#xff0c;自动返…

python中的局部变量、全局变量问题的思考(对比于c语言)

今天在运行python时遇到了局部变量和全局变量的问题&#xff0c;令我很迷惑。 首先&#xff0c;我在学习python之前先学习了c语言&#xff0c;所以c语言的一些东西影响了我对这个问题的思考。 在c语言中 局部变量和全局变量的区别就在于作用域的范围大小。在c语言中&#xf…

进网许可认证、交换路由设备检测项目更新25年1月起

实施时间 2025年1月1日起实施 涉及设备范围 核心路由器、边缘路由器、以太网交换机、三层交换机、宽带网络接入服务器&#xff08;BNAS&#xff09; 新增检测依据 GBT41266-2022网络关键设备安全检测方法交换机设备 GBT41267-2022网络关键设备安全技术要求交换机设备 GB/…

文件,IO流

目录 一 java 1. IO流 1&#xff09;输入输出&#xff08;以程序的视角判断 &#xff09; 1.1 IO流的分类 1&#xff09;字符流效率高于字节流 1.2 流和文件的关系 2. inputstream--字节输入流 2.1 fileinputstream 2.1.1常用方法&#xff1a; 1&#xff09;单个字符…

pymssql-2.1.4.dev5-cp37-cp37m-win_amd64.whl 安装

pip install pymssql 安装pymssql出现下面的问题 error: Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools 因为要使用python连接sqlserver数据库&#xff0c;需要pymssq…

vue中验证码的实现方式

在写登录页的时候有的系统会让你也进行一下验证码绘制&#xff0c;那么验证码如何实现的呢&#xff1f;我在写登录页的时候通过将登录框&#xff0c;验证码分开页面来写&#xff0c;最后将它们变成标签来导入到我的样式页面中&#xff0c;这样写不仅方便&#xff0c;更容易修改…

致远互联OA使用问题及解决方法记录(个人)

1、更换设备登录账号出现绑定要求 解决&#xff1a;后台管理员账号——M3安全管理——安全设置——删除绑定 2、审批消息错误回退 解决&#xff1a;协同工作——一已办事项——取回——重新审批/流程监督里撤回/流程索道节点回退 3、签章图片在表单上显示过大 解决&#x…

《计算机组成及汇编语言原理》阅读笔记:p9-p27

《计算机组成及汇编语言原理》学习第 2 天&#xff0c;p9-p27 总结&#xff0c;总计 19 页。 一、技术总结 1.quantum physics(量子物理学) (1)quantum(量子) quantum的本意是&#xff1a;c. the smallest amount of sth(量子)。 In physics, a quantum is the minimum am…

java_章节作业

第1题 package com.hspedu.homework;/*** author:寰愬悏瓒&#xfffd;* date:2024/12/19 version:1.0*/ public class Homework01 {public static void main(String[] args) {//初始化Person对象数组&#xff0c;有3个Person对象&#xff1b;Person[] persons new Person[3];…

Audiocraft智能音频和音乐生成工具部署及使用

1、概述 Facebook开源了一款名为AudioCraft的AI音频和音乐生成工具。 该工具可以直接从文本描述和参考音乐生成高质量的音频和音乐。AudioCraft包含MusicGen、AudioGen和EnCodec三个模型&#xff0c;分别实现音乐生成、音频生成和自定义音频模型构建。 2、项目地址 https://…

华为云计算HCIE笔记02

第二章&#xff1a;华为云Stack规划设计 交付总流程 准备工作&#xff1a;了解客户的基本现场&#xff0c;并且对客户的需求有基本的认知。 HLD方案BOQ报价设备采购和设备上架 2.安装部署流程 硬件架构设计 硬件设备选配 设备上架与初始化配置 准备相关资料&#xff08;自动下载…

StarRocks:存算一体模式部署

目录 一、StarRocks 简介 二、StarRocks 架构 2.1 存算一体 2.2 存算分离 三、前期准备 3.1前提条件 3.2 集群规划 3.3 配置环境 3.4 准备部署文件 四、手动部署 4.1 部署FE节点 4.2 部署BE节点 4.3 部署CN节点&#xff08;可选&#xff09; 4.4 FE高可用…

红米Note 9 Pro5G刷小米官方系统

前言 刷机有2种方式&#xff1a;线刷 和 卡刷。 线刷 线刷&#xff1a;需要用电脑刷机工具&#xff0c;例如&#xff1a;XiaoMiFlash.exe&#xff0c;通过电脑和数据线对设备进行刷机。 适用场景&#xff1a; 系统损坏无法开机。恢复官方出厂固件。刷机失败导致软砖、硬砖的…

关于Tomcat的一些关键参数

目录 Tomcat参数总览设置位置 参数分析Tomcat内部类maxConnections属性Tomcat内部类的acceptCountTomcat有几个Acceptor线程Tomcat的工作线程池 Tomcat参数总览 package org.springframework.boot.autoconfigure.web; /** * * {link ConfigurationProperties ConfigurationP…

网络安全核心目标CIA

网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨&#xff0c;机密性、可用性、完整性频频出现&#xff0c;被简称为CIA&#xff0c;也被成为你AIC&#xff0c;只是顺序不同而已…

HIPT论文阅读

题目《Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning》 论文地址&#xff1a;[2206.02647] Scaling Vision Transformers to Gigapixel Images via Hierarchical Self-Supervised Learning 项目地址&#xff1a;mahmoodlab/HI…