likes
comments
collection
share

Electron应用通过命令行打开系统设置

作者站长头像
站长
· 阅读数 18

背景

最近在做的一个Electron应用的需求,是关于会议的。

需求很简单:在加入会议之前,首先检测用户有没有授予当前应用麦克风权限,如果没有授予麦克风权限,那么弹窗提示用户未获得该权限,并提供一个可点击的按钮,用户通过点击该按钮可快速打开【系统设置-隐私与安全性-麦克风】页面(MacOS)或【设置-隐私-麦克风】页面(Windows),快速对当前应用授权。

  • MacOS示例图 Electron应用通过命令行打开系统设置

  • Windows示例图 Electron应用通过命令行打开系统设置

思考

一开始,我以为实现这个需求很简单,调用一下Electron提供的API不就完事了,就这?

事实上,我只猜对了一半,实现的确简单,只不过我方向错了——因为Electron官方API并没有提供打开对应桌面操作系统的系统设置的方法。其实仔细想想也应该要想到了,若真这么做,Electron干脆自己搞一个系统得了。

通过查找相关资料得知,MacOS和Windows是可以通过命令行打开应用的,那么打开系统的隐私设置页面也不在话下。参考资料的链接放在最后了,感兴趣的朋友可以点进去看看,了解一下。

实现方式

  1. 首先通过Electron主进程的systemPreferences模块中的 getMediaAccessStatus 方法,获取当前需要查询的媒体类型的访问权限状态,主进程在初始化的时候监听该方法(具体API请自行查看Electron文档); 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')
})
  1. 渲染进程在需要使用麦克风或者摄像头权限的页面,和主线程通信,获取对应媒体访问权限状态;

注意:这里使用的是 sendSync 发送同步消息将阻止整个渲染过程直到收到回复,若不希望这样,可以通过异步的方式,具体查看Electron文档。

// ipcRenderer
const { ipcRenderer } = require('electron')
const microphoneAccess = ipcRenderer.sendSync('getMediaAccessStatus', { mediaType: 'microphone' })
const cameraAccess = ipcRenderer.sendSync('getMediaAccessStatus', { mediaType: 'camera' })
  1. 拿到麦克风或摄像头的访问权限,到这里就可以通过脚本打开操作系统的系统设置页面了。
  • MacOS 使用 open 命令,举个例子:

Electron应用通过命令行打开系统设置

  • Windows 使用 start 命令,举个例子:

Electron应用通过命令行打开系统设置

  • Electron执行命令行通过nodejschild_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)
}
  1. 至此,文章开头所要实现的功能,都OK了。检测摄像头权限的实现方法也是一样的,这里就不赘述。

参考资料链接

转载自:https://juejin.cn/post/7162919977517842440
评论
请登录