适用于 Web 的 Permissions API

Matt Gaunt

如果您使用过 Geolocation API 您可能需要检查自己是否有权使用 进行地理定位时不发出提示。这根本不可能。您必须请求当前位置,这将指示权限状态或导致向用户显示提示。

并非所有 API 都是如此。Notifications API 有一种自己的方式 你可以通过以下方式查看当前权限状态: Notification.permission

随着网络平台在 API 方面的发展,需要为 API 使用单一的标准方法 因此您不必费心记住权限, 每个 API 的工作原理Chrome 版本 43 中提供的 Permission API 为 旨在成为一种检查 API 权限状态的标准方式。

permissions.query()

使用 permissions.query() 方法检查权限的状态。这将 返回状态:“同意”(您有权限)、“已拒绝”(您被禁止访问 访问 API)或 提示(用户需要 )。例如:

// Check for Geolocation API permissions
navigator.permissions.query({name:'geolocation'})
    .then(function(permissionStatus) {
    console.log('geolocation permission state is ', permissionStatus.state);

    permissionStatus.onchange = function() {
        console.log('geolocation permission state has changed to ', this.state);
    };
    });

query 方法采用 PermissionDescriptor 对象,您可以在此对象中定义权限的名称。响应是一个 Promise 解析为 PermissionStatus 对象。在此对象中,您可以使用 permissionStatus.state 检查状态 “granted”“denied”或“提示”你还可以实现 permissionStatus.onchange 的处理程序,并处理权限更改 状态。

支持的 PermissionDescriptor

在上面的示例中,我们重点介绍了如何查询 地理定位,具有以下权限描述符:{name:'geolocation'}

通知权限描述符与之类似,因为它只需要 name 属性:{name:'notifications'}

推送midi 各有一个 该 API 所特有的参数。

对于推送权限,您可以提供 userVisibleOnly 参数。 指明您是否希望为每条推送消息显示通知 或能够发送无声推送通知(目前 支持带有通知的推送通知)。您可以这样使用:

navigator.permissions.query({name:'push', userVisibleOnly:true})

Midi 允许使用 sysex 参数。指明您是否需要和/或接收 系统专有消息。对于 midi,代码为:

navigator.permissions.query({name:'midi', sysex:true})

请求权限

向用户请求权限取决于具体的 API。例如: 当您调用 getCurrentPosition() 时,地理定位功能会显示权限提示。

navigator.geolocation.getCurrentPosition(function(position) {
    console.log('Geolocation permissions granted');
    console.log('Latitude:' + position.coords.latitude);
    console.log('Longitude:' + position.coords.longitude);
});

而当您调用 requestPermission() 时,通知会提示用户。

Notification.requestPermission(function(result) {
    if (result === 'denied') {
    console.log('Permission wasn\'t granted. Allow a retry.');
    return;
    } else if (result === 'default') {
    console.log('The permission request was dismissed.');
    return;
    }
    console.log('Permission was granted for notifications');
});

重点在于,Permission API 让您能以一致的方式来监控 同时能够支持当前已启用的 API 范围, 。

这样做的一大优势在于 只有在对用户显而易见您为什么需要额外操作时才提示用户 并充分利用这些 API 已授予权限。

您可以在此处找到完整的示例

浏览器支持

Chrome 是首个实施此功能的浏览器,而 Mozilla 正计划 而 Microsoft 也已表现出对 API 的兴趣。

已知问题

  • 如果用户关闭该权限,地理定位将不会重新显示提示 请求。不过,权限状态仍为“提示”。 [bugs.chromium.org]