Electron App 在 MacOS 下 申請攝像頭及麥克風權限踩坑指南

公司的 Electron 應用,偶爾會在 設備檢測 時  Crash ,後來通過排查發現是當前 App 沒有攝像頭和麥克風的權限。致使在  設備檢測 時出現了崩潰。

macOS 10.14 及以上版本,開發者必須對其本身的應用明確授予麥克風、攝像頭權限。不然沒法調用系統的攝像頭、麥克風。如想見詳情,可見: Requesting Authorization for Media Capture on macOSmacos

其中 Apple 文檔裏標註了,若是你想使用麥克風、攝像頭權限則須要在 plist 文件裏指定相關的屬性才能夠,以下:安全

這兩個屬性從後面的 Description 就能看到這是一個說明你的程序爲何要使用麥克風和攝像頭的屬性。bash

Electron App 打包,通常都是使用 electron-builder 這個庫來進行打包,而這個庫的文檔裏針對於 mac 打包,有這麼一個屬性: extendInfo 他的用途是把你的自定義的屬性加入到 plist 文件裏,在 electro-builder.yml 文件裏的寫法以下:app

mac:
  extendInfo:
    NSMicrophoneUsageDescription: 請容許本程序訪問您的麥克風
    NSCameraUsageDescription: 請容許本程序訪問您的攝像頭複製代碼

可是當你這麼寫完會發現,並無起到任何的做用,由於這兩個屬性只是用於說明你的應用爲何要申請權限。可是卻沒有指定申請權限的行爲。electron

若是要指定申請攝像頭、麥克風的權限,須要如下的屬性:ui

  • com.apple.security.device.camera
  • com.apple.security.device.audio-input

而這兩個屬性,在添加時有一個前提,就是你必須開啓了 hardenedRuntime,這個東西是爲了增強應用運行時的完整性,如想見詳情,可見: Hardened Runtime Entitlementsspa

那麼如今咱們再添加一下 hardenedRuntime :code

mac:
  hardenedRuntime: true
  extendInfo:
    NSMicrophoneUsageDescription: 請容許本程序訪問您的麥克風
    NSCameraUsageDescription: 請容許本程序訪問您的攝像頭複製代碼

hardenedRuntime 這個屬性,在 electron-builder21.1.3 版本已經默認爲 true ,而在 21.1.2 ~ 20.41.0 版本里,這個屬性的默認值是 false。再日後的版本里沒有這個屬性。orm

而後在申請的行爲須要利用 entitlements 屬性。代碼以下:xml

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>複製代碼

可是當你這麼嘗試的時候,會發現的應用打開會直接崩潰,亦或者根本沒法正常的打包。

這是由於當你開啓了 hardenedRuntime 來增強應用的安全性時,那麼你須要把這個安全性放寬一點。也就是說你須要在 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.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 上正常申請/使用攝像頭和麥克風了。

相關文章
相關標籤/搜索