最近公司在做Electron桌面端项目,我负责macOS端打包上传到Mac App Store的工作。
期间卡了2天没有进展,今天总算搞定了,记录一下整个的操作过程。
因为我之前只做过Cordova Xcode 的打包上传,并没有Electron 的上传经验,很多知识点和流程都是现去理解的。
当有些名词不理解的时候,无论看中文还是看英文的文档,其实都跟看天书一样,特别的酸爽。
希望这次通过我自己的理解也可以帮到需要的人。
首先说明一下:
这里所有的操作流程都是针对2020年之前有效,之后Apple和Electron的变化可能并不完全适用,仅供参考。
知识背景的参考链接及说明:
首先你需要一个开发者账号,
可以用自己苹果手机的Apple ID,
让公司的apple account管理员把你加进去,设置成app manager角色
这样你就可以自己生成Electron所需的企业版 certificates, identifiers 和 provisioning profile.
准备工作1:
Electron 上传App Store 需要创建4种类型的证书
Mac Installer Distribution :负责安装应用时认证
Mac App Distribution:负责上传App Store时认证,注:因为属于第三方应用,此证书无法在Xcode Account 中添加生成,我是在Apple Developer的平台创建的
Distribution:负责本地部署打包时签名(code singing)使用
Development: 为防止意外打包时找不到相关证书,最好也生成一下
其中Mac App Distribution 证书需要手动下载了安装到 Mac 的 keychain中。
最终效果如下:
准备工作2:
创建AppID,其实就是Identifier, 用来唯一标识你的APP,格式一般为 com.公司名.APP名
准备工作3:
创建provisioning profile, 这个可以理解为证书和设备的一个关联文件,打包的时候也会用到。创建的时候需要选择对应的appID
准备工作4:
在左侧 membership 菜单中找到 公司的 Team ID, 存下来备用
到此,Apple Developer平台的准备工作就告一段落了
--------------------------------------------------------
https://appstoreconnect.apple.com/login
登录Apple的APP商店管理平台,这里的角色权限(App Manager)是和Apple Developer同步的。
准备工作5:
点击 + 号,创建要上传的应用信息,
选择AppID, 也叫BundleID, Identifier ID,就是之前 “ 准备工作2” 我们创建好的,
填写对应相关信息,效果如下:
准备工作6:
登录自己的Apple ID, 在Security一栏中,生成 APP-SPECIFIC PASSWORDS,用来 验证/上传pkg文件到Mac App Store时所需的密码
准备工作7:
当时上传过程中报错没有找到512*512和512*512@x2的图标,这里重新生成一下所需的 icon.icns
注意必须是icns类型的图标。方法可参考一下链接
至此,所以准备工作就都可以了。
--------------------------------------------------------
使用electron build 打包应用,
electron-build 工具的 相关配置也是看了好多遍才弄明白,
在Apple Store上传masOS App 需要 pkg 扩展名文件,
这里我们选择 MAS 类型打包,
截个图,列下来我在package.json里的配置
打包的时候需要code signing, 指定 CSC_NAME = "公司的证书名", 这样就能绑定到部署用的证书了。
打包好的pkg需要做一些针对electron特有的 entitlement 添加和 sandbox 配置,
具体方法参见官网
如果还是不清楚,下面这个文章对我很有帮助,强烈建议大家点进去按步骤操作
https://webspaceteam.com/electron/how-to-publish-an-electron-application-to-mac-app-store
大概意思就是创建几个plist文件, 替换为自己的TeamID( "准备工作4" )和BundleID
通过bash脚本去修改打包后文件里面的几个plist,然后重新生成pkg文件包
最终command line效果如下:
---------------------------------------------------------
https://help.apple.com/app-store-connect/#/devb1c185036
这是最后一步了,需要把修改后的打包文件验证并上传到app store connect,
使用的工具是
命令行 xcode altool:https://help.apple.com/asc/appsaltool/
或者 下载图形用户工具:https://help.apple.com/itc/transporter/
这里我用的是xcode altool,
需要注意的是 --validate-app 参数验证时报错说找不到 iOS App,
因为我们的是 macOS App, 所以直接使用 --upload-app 参数,也会进行验证,有问题会报错,没问题就上传成功了。
注意:这里的参数 -p 是"准备工作6" 中生成的 APP-SPECIFIC PASSWORDS
Command line效果如下
刚上传完需要等1-2分钟后才能在App store connect 看到结果:
最终效果在App store connect 如下:
怎么处理 Missing Compliance
在选择完build包之后,商店平台会弹出4个问题让你回答。
1:Does your app use encryption?
选Yes,指是否用https做数据传输
2:Does your app qualify for any of the exemptions provided in Category 5, Part 2 of the U.S. Export Administration Regulations?
选 NO,没有自定义的密码学
3:Does your app implement any encryption algorithms that are proprietary or not accepted as standards by international standard bodies (IEEE, IETF, ITU, etc.)?
选NO,没有自定义算法,除非是银行类软件
4: Does your app implement any standard encryption algorithms instead of, or in addition to, using or accessing the encryption within Apple’s operating system?
选NO, 美国的规则有个例外,如果只用https调用就不需要
之后点确定,就可以解决那个警告了。
-------------------------------------------------
后续更新:在公司官网下载dmg文件,安装到电脑时提示“恶意软件”的解决方法。
这个问题的根源是没有做证书认证,notarized。
登陆 https://developer.apple.com/account/
添加一个Developer ID Applecation 类型的证书
此证书的作用是在Apple Store之外下载时需绑定的证书,如果没有,安装时就会提示“恶意软件”
此证书需要Account Holder权限才能生成,我是让公司主管帮忙生成的。
拿到证书后双击就可以导入到keychain, 效果如下:
下一步就可以按照官网提供的electron notarized 方法去解决了。
链接如下:
https://kilianvalkhof.com/2019/electron/notarizing-your-electron-application/
步骤这里简单说一下:
1.创建plist文件
2. 创建脚本,使用"electron-notarize" 模块,对你的APP进行证书认证
注意:这里的密码是 "准备工作6" 中生成的 APP-SPECIFIC PASSWORDS
3.增加 build config
4. 最后,在dmg 对象中添加 sign: false
"dmg": { "sign": false },
这样,再次运行打包脚本,
如果一切设置正常,
你的APP就不会报“恶意软件”了。
同时还会收到一封Apple发来的邮件。