searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

在 Electron 应用中,获取 Mac 的摄像头和麦克风权限的两种方式

2025-10-11 10:04:18
3
0

在使用 Electron 开发应用时,有很多时候需要音视频聊天相关的业务,但是在 Mac 中,默认是获取不到摄像头和麦克风的权限的,在获取摄像头和麦克风权限之前,需要判断是否已经获取了权限,若是没有,那么需要引导MAc用户去系统设置中开启权限。

1. 配置要获取的权限

首先是在对应用打包时,要先声明可能要使用的权限。先创建一个 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 应用是使用的 electron-builder 构建的, electron-builder.json 需要添加如下配置:
{
  "mac": {
    "hardenedRuntime": true,
    "gatekeeperAssess": false,
    "entitlementsInherit": "build/entitlements.mac.plist",
    "extendInfo": {
      "NSDocumentsFolderUsageDescription": "需要访问您的文档目录以展示相关文件",
      "NSDownloadsFolderUsageDescription": "需要访问您的下载目录以展示相关文件",
      "NSMicrophoneUsageDescription": "请允许访问您的麦克风",
      "NSCameraUsageDescription": "请允许访问您的摄像头"
    }
  }
}

配置完成后,就可以在程序中索取需要的权限了

2. 获取权限

音视频通话前,仍然需要先判断,是否已经获取了权限。若没有获取权限,最好跳转到设置页面,让用户手动打开

在 electron 中,获取权限的代码如下:

import { ipcMain, systemPreferences } from "electron";

// 判断是否有相关的权限
ipcMain.handle("getMediaAccess", (_, mediaType: "microphone" | "camera" | "screen") => {
  const access = systemPreferences.getMediaAccessStatus(mediaType) === "granted";
  logger.info(`get ${mediaType} access: ${access}`);
  return access;
});

// 索取权限
ipcMain.handle("askForMediaAccess", (_, mediaType: "microphone" | "camera") => {
  return systemPreferences.askForMediaAccess(mediaType);
});

// 打开设置页
ipcMain.handle(
  "openSystemPreferences",
  (_, security: "Privacy_ScreenCapture" | "Privacy_Camera" | "Privacy_Microphone") => {
    if (os.platform() === "darwin") {
      const pane = "security";
      exec(`open "x-apple.systempreferences:com.apple.preference.${pane}?${security}"`);
    }
  }
);

在前端页面中:

const handleClick = async (mediaType: "screen" | "camera" | "microphone") => {
  const access = await window.electronAPI?.ipcInvoke("getMediaAccess", mediaType);
  if (!access) {
    message.warning("暂无权限");
    const result = await window.electronAPI?.ipcInvoke("askForMediaAccess", mediaType);
    if (result) {
      return;
    }

    window.electronAPI?.ipcInvoke("openSystemPreferences", mapping[mediaType].system);
  }
};

 

 

3. 总结

Mac 的操作系统通常有更严格的管理权限机制,比如访问摄像头、麦克风、定位权限等等。在使用时,要考虑到授权的问题。

0条评论
0 / 1000
c****u
9文章数
0粉丝数
c****u
9 文章 | 0 粉丝
原创

在 Electron 应用中,获取 Mac 的摄像头和麦克风权限的两种方式

2025-10-11 10:04:18
3
0

在使用 Electron 开发应用时,有很多时候需要音视频聊天相关的业务,但是在 Mac 中,默认是获取不到摄像头和麦克风的权限的,在获取摄像头和麦克风权限之前,需要判断是否已经获取了权限,若是没有,那么需要引导MAc用户去系统设置中开启权限。

1. 配置要获取的权限

首先是在对应用打包时,要先声明可能要使用的权限。先创建一个 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 应用是使用的 electron-builder 构建的, electron-builder.json 需要添加如下配置:
{
  "mac": {
    "hardenedRuntime": true,
    "gatekeeperAssess": false,
    "entitlementsInherit": "build/entitlements.mac.plist",
    "extendInfo": {
      "NSDocumentsFolderUsageDescription": "需要访问您的文档目录以展示相关文件",
      "NSDownloadsFolderUsageDescription": "需要访问您的下载目录以展示相关文件",
      "NSMicrophoneUsageDescription": "请允许访问您的麦克风",
      "NSCameraUsageDescription": "请允许访问您的摄像头"
    }
  }
}

配置完成后,就可以在程序中索取需要的权限了

2. 获取权限

音视频通话前,仍然需要先判断,是否已经获取了权限。若没有获取权限,最好跳转到设置页面,让用户手动打开

在 electron 中,获取权限的代码如下:

import { ipcMain, systemPreferences } from "electron";

// 判断是否有相关的权限
ipcMain.handle("getMediaAccess", (_, mediaType: "microphone" | "camera" | "screen") => {
  const access = systemPreferences.getMediaAccessStatus(mediaType) === "granted";
  logger.info(`get ${mediaType} access: ${access}`);
  return access;
});

// 索取权限
ipcMain.handle("askForMediaAccess", (_, mediaType: "microphone" | "camera") => {
  return systemPreferences.askForMediaAccess(mediaType);
});

// 打开设置页
ipcMain.handle(
  "openSystemPreferences",
  (_, security: "Privacy_ScreenCapture" | "Privacy_Camera" | "Privacy_Microphone") => {
    if (os.platform() === "darwin") {
      const pane = "security";
      exec(`open "x-apple.systempreferences:com.apple.preference.${pane}?${security}"`);
    }
  }
);

在前端页面中:

const handleClick = async (mediaType: "screen" | "camera" | "microphone") => {
  const access = await window.electronAPI?.ipcInvoke("getMediaAccess", mediaType);
  if (!access) {
    message.warning("暂无权限");
    const result = await window.electronAPI?.ipcInvoke("askForMediaAccess", mediaType);
    if (result) {
      return;
    }

    window.electronAPI?.ipcInvoke("openSystemPreferences", mapping[mediaType].system);
  }
};

 

 

3. 总结

Mac 的操作系统通常有更严格的管理权限机制,比如访问摄像头、麦克风、定位权限等等。在使用时,要考虑到授权的问题。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0