對Electron應用進行簽名打包后,在Mac端發(fā)現(xiàn)調(diào)用攝像頭、麥克風的時候應用會直接崩潰,而之前打的沒有經(jīng)過簽名的包是沒有問題的。
后來查找資料發(fā)現(xiàn)是權(quán)限申請的問題。
以下內(nèi)容轉(zhuǎn)載于:
Electron App 在 MacOS 下 申請攝像頭及麥克風權(quán)限踩坑指南
macOS 10.14 及以上版本,開發(fā)者必須對其自己的應用明確授予麥克風、攝像頭權(quán)限。否則無法調(diào)用系統(tǒng)的攝像頭、麥克風。如想見詳情,可見: Requesting Authorization for Media Capture on macOS
其中 Apple 文檔里標注了,如果你想使用麥克風、攝像頭權(quán)限則需要在 plist 文件里指定相關(guān)的屬性才可以,如下:
這兩個屬性從后面的 Description 就能看到這是一個說明你的程序為什么要使用麥克風和攝像頭的屬性。
而 Electron App 打包,一般都是使用 electron-builder 這個庫來進行打包,而這個庫的文檔里針對于 mac 打包,有這么一個屬性: extendInfo 他的用途是把你的自定義的屬性加入到 plist 文件里,在 electro-builder.yml 文件里的寫法如下:
mac:
extendInfo:
NSMicrophoneUsageDescription: 請允許本程序訪問您的麥克風
NSCameraUsageDescription: 請允許本程序訪問您的攝像頭復制代碼
但是當你這么寫完會發(fā)現(xiàn),并沒有起到任何的作用,因為這兩個屬性只是用于說明你的應用為什么要申請權(quán)限。但是卻沒有指定申請權(quán)限的行為。
如果要指定申請攝像頭、麥克風的權(quán)限,需要以下的屬性:
- com.apple.security.device.camera
- com.apple.security.device.audio-input
而這兩個屬性,在添加時有一個前提,就是你必須開啟了 hardenedRuntime,這個東西是為了加強應用運行時的完整性,如想見詳情,可見: Hardened Runtime Entitlements
那么現(xiàn)在我們再添加一下 hardenedRuntime :
mac:
hardenedRuntime: true
extendInfo:
NSMicrophoneUsageDescription: 請允許本程序訪問您的麥克風
NSCameraUsageDescription: 請允許本程序訪問您的攝像頭復制代碼
hardenedRuntime 這個屬性,在 electron-builder 的 21.1.3 版本已經(jīng)默認為 true ,而在 21.1.2 ~ 20.41.0 版本里,這個屬性的默認值是 false。再往后的版本里沒有這個屬性。
然后在申請的行為需要利用 entitlements 屬性。代碼如下:
electron-builder.yml
mac:
entitlements: entitlements.mac.plist
hardenedRuntime: true
extendInfo:
NSMicrophoneUsageDescription: 請允許本程序訪問您的麥克風
NSCameraUsageDescription: 請允許本程序訪問您的攝像頭復制代碼
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.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
</dict>
</plist>復制代碼
但是當你這么嘗試的時候,會發(fā)現(xiàn)的應用打開會直接崩潰,亦或者根本無法正常的打包。
這是因為當你開啟了 hardenedRuntime 來加強應用的安全性時,那么你需要把這個安全性放寬一點。也就是說你需要在 entitlements.mac.plist 里在指定一下下面的屬性:
- com.apple.security.cs.allow-jit
- com.apple.security.cs.allow-unsigned-executable-memory
- com.apple.security.cs.allow-dyld-environment-variables
那么現(xiàn)在最終的 entitlements.mac.plist 內(nèi)容如下:
<?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.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>復制代碼
自此,你的 Electron App 就應該可以在 macOS 上正常申請/使用攝像頭和麥克風了。