Electron应用通过命令行打开系统设置
背景
最近在做的一个Electron应用的需求,是关于会议的。
需求很简单:在加入会议之前,首先检测用户有没有授予当前应用麦克风权限,如果没有授予麦克风权限,那么弹窗提示用户未获得该权限,并提供一个可点击的按钮,用户通过点击该按钮可快速打开【系统设置-隐私与安全性-麦克风】页面(MacOS)或【设置-隐私-麦克风】页面(Windows),快速对当前应用授权。
-
MacOS示例图
-
Windows示例图
思考
一开始,我以为实现这个需求很简单,调用一下Electron提供的API不就完事了,就这?
事实上,我只猜对了一半,实现的确简单,只不过我方向错了——因为Electron官方API并没有提供打开对应桌面操作系统的系统设置的方法。其实仔细想想也应该要想到了,若真这么做,Electron干脆自己搞一个系统得了。
通过查找相关资料得知,MacOS和Windows是可以通过命令行打开应用的,那么打开系统的隐私设置页面也不在话下。参考资料的链接放在最后了,感兴趣的朋友可以点进去看看,了解一下。
实现方式
- 首先通过Electron主进程的
systemPreferences
模块中的getMediaAccessStatus
方法,获取当前需要查询的媒体类型的访问权限状态,主进程在初始化的时候监听该方法(具体API请自行查看Electron文档);
// ipcMain
const { ipcMain, systemPreferences } = require('electron')
ipcMain.on('getMediaAccessStatus', (event, params) => {
const mediaType = params.mediaType || ''
const res = systemPreferences.getMediaAccessStatus(mediaType)
console.log(`${mediaType}: `, res)
event.returnValue = (res === 'granted')
})
- 渲染进程在需要使用麦克风或者摄像头权限的页面,和主线程通信,获取对应媒体访问权限状态;
注意:这里使用的是
sendSync
发送同步消息将阻止整个渲染过程直到收到回复,若不希望这样,可以通过异步的方式,具体查看Electron文档。
// ipcRenderer
const { ipcRenderer } = require('electron')
const microphoneAccess = ipcRenderer.sendSync('getMediaAccessStatus', { mediaType: 'microphone' })
const cameraAccess = ipcRenderer.sendSync('getMediaAccessStatus', { mediaType: 'camera' })
- 拿到麦克风或摄像头的访问权限,到这里就可以通过脚本打开操作系统的系统设置页面了。
- MacOS 使用
open
命令,举个例子:
- Windows 使用
start
命令,举个例子:
- Electron执行命令行通过
nodejs
的child_process
const exec = require('child_process').exec
// 伪代码
if (没有麦克风权限) {
const curtOS = 'Mac' // 比如是Mac
const curtMediaType = 'microphone' // 比如是麦克风
const platformCommandMap = {
Windows: {
camera: `start ms-settings:privacy-webcam`,
microphone: `start ms-settings:privacy-microphone`
},
Mac: {
camera: `open x-apple.systempreferences:com.apple.preference.security\?Privacy_Camera`,
microphone: `open x-apple.systempreferences:com.apple.preference.security\?Privacy_Microphone`
}
}
const command = platformCommandMap[curtOS][curtMediaType] || ''
command && execCommand(command)
}
- 至此,文章开头所要实现的功能,都OK了。检测摄像头权限的实现方法也是一样的,这里就不赘述。
参考资料链接
转载自:https://juejin.cn/post/7162919977517842440