添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Loading...

Mac Electron如何进行应用签名配置和认证?

在使用了小鱼Electron SDK的应用构建Mac端的应用时,需要进行应用的签名处理,否则可能会在首次打开的时候出现“恶意软件”等类似提示。

并且在签名打包时,如果配置不当,则可能出现类似如下问题:

Uncaught Error: node-loader:
Error: dlopen(/var/folders/gw/267w81fd6jxdckh4y3z2t39w0000gn/T/.com.ainemo.NemoDesktop.upDqGF, 0x0001): tried: '/var/folders/gw/267w81fd6jxdckh4y3z2t39w0000gn/T/.com.ainemo.NemoDesktop.upDqGF'
(code signature in <1DE3A11C-4B6D-3749-893A-5ACCB4D99933>
'/private/var/folders/gw/267w81fd6jxdckh4y3z2t39w0000gn/T/.com.ainemo.NemoDesktop.upDqGF' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.),
'/private/var/folders/gw/267w81fd6jxdckh4y3z2t39w0000gn/T/.com.ainemo.NemoDesktop.upDqGF' (code signature in <1DE3A11C-4B6D-3749-893A-5ACCB4D99933>
'/private/var/folders/gw/267w81fd6jxdckh4y3z2t39w0000gn/T/.com.ainemo.NemoDesktop.upDqGF' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.)

那么,如何进行签名配置呢?

构建配置

本配置适用于小鱼Electron SDK示例程序(Vue和React)项目,如果是第三方集成项目,请酌情参考。

React项目

1、检查确认项目中electron-builder构建工具的版本>=v23.0.3,否则在签名构建时,会出现类似如下错误:

Exit code: ENOENT. spawn /usr/bin/python ENOENT

2、在package.json中build配置上开启 ​​​​asar​​​​​ 和 ​ ​hardenedRuntime​ ​​​,其中asar用来进行打包文件归档压缩,hardenedRuntime是用来进行强化应用运行时,在 应用认证 申请设备权限 时必须开启;

伪配置代码:

"build": {
"productName": "XYLinkMeeting",
"appId": "com.xxx.xxx",
"compression": "normal",
"asar": true,
"mac": {
"category": "xylink.app.category.type",
"hardenedRuntime": true,
"gatekeeperAssess": false,
"icon": "static/logo.png",
"target": "dmg",
"entitlements": "static/entitlements.mac.plist",
"entitlementsInherit": "static/entitlements.mac.plist",
"extendInfo": {
"NSMicrophoneUsageDescription": "请允许本程序访问您的麦克风",
"NSCameraUsageDescription": "请允许本程序访问您的摄像头"
},
"extraFiles": [
{
"from": "../cpp_sdk/mac/dll",
"to": "./Frameworks",
"filter": [
"**/*"
]
}
]
},
"win": {
...
}
},

3、由于Electron SDK需要申请使用摄像头和麦克风权限,添加自定义属性配置:extendInfo,针对麦克风和摄像头权限申请进行说明:

"extendInfo": {
"NSMicrophoneUsageDescription": "请允许本程序访问您的麦克风",
"NSCameraUsageDescription": "请允许本程序访问您的摄像头"
},

添加完成后,仅说明你的应用为什么要申请权限,但是却没有指定申请权限的行为,所以需要在 entitlements.mac.plist 文件中项目指定申请哪些权限,配置 entitlements 和 entitlementsInherit,并指向 entitlements.mac.plist文件地址;

"entitlements": "static/entitlements.mac.plist",
"entitlementsInherit": "static/entitlements.mac.plist",

entitlements.mac.plist 文件配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
</dict>
</plist>

4、申请苹果证书并安装到Mac电脑;

提示

苹果证书中的应用bundleId和打包build配置中的appid需要保持一致,否则可能签名失败;

5、构建Mac应用,此时可以看到签名处理:

Vue项目

Vue项目的配置方式同React,但配置是在 vue.config.js 文件中配置,不是在 package.json 文件中;

需要注意的是,Vue项目大多数是使用vue-cli搭建,在构建Electron安装包时,不直接使用electron-builder工具,而是使用了vue的封装工具:​ ​vue-cli-plugin-electron-builder​ ​,此工具内部依赖了electron-builder,所以我们需要特殊指定内部electron-builder的版本>=23.0.3:

  "overrides": {
"vue-cli-plugin-electron-builder/electron-builder": "^23.0.3"
},

其他配置内容同React,请一定注意!

应用公证

在如上的配置中,我们可以成功的构建Mac的签名应用包,但实际运行时,我们有可能会遇到:

这是因为Mac在MacOS 10.14.5 之后,应用如果没有进行公证(将安装包上传到 Apple 审查),首次打开的时候就会出现更严重的“恶意软件”或者“非法开发者”等提示。

所以也需要针对强化并签名过的Electron应用进行认证处理,保证用户主动安装和通过AppStore安装的正确访问;

注意 :应用认证时,需要签名的应用包开启了 ​hardenedRuntime​ ​​​,否则可能出现认证失败问题:

此处我们使用xcrun命令工具进行应用包的公证:

xcrun altool --notarize-app --primary-bundle-id "xxx.xxx.xxx" --username "xxx" --password "xxxx" --file XYLinkMeeting-0.3.1-3.dmg

工具执行后,会将应用上传到苹果服务器进行公证,最终结果可以收到苹果的邮件通知或通过工具查询:

xcrun altool --notarization-history 0 -u "xxxx" -p "xxxx"

公证通过的内容如下:

公证通过后,再安装包即可正常访问。

意见反馈