适用于 Web 的 Permissions API

Matt Gaunt

如果您之前使用过 Geolocation API,可能希望检查自己是否有权在不显示提示的情况下使用地理定位功能。这根本不可能。您必须请求当前位置信息,这会指示权限状态或导致系统向用户显示提示。

并非所有 API 都以这种方式运行。Notifications API 有自己的方法,可让您通过 Notification.permission 检查当前权限状态。

随着 Web 平台 API 的不断增加,开发者需要一种标准的方式来检查权限状态,而不是记住每个 API 的运作方式。Permission APIChrome 版本 43 中提供)旨在成为检查 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);
    };
    });

查询方法接受 PermissionDescriptor 对象,您可以在其中定义权限的名称。响应是一个 Promise,会解析为 PermissionStatus 对象。通过此对象,您可以使用 permissionStatus.state 检查状态,以确定是“已授予”“已拒绝”还是“提示”。您还可以为 permissionStatus.onchange 实现事件处理脚本,并处理权限状态的更改。

支持的 PermissionDescriptor

在上面的示例中,我们重点介绍了如何使用以下权限描述符 {name:'geolocation'} 查询地理位置信息权限状态。

通知权限描述符与之类似,只需要一个名称属性:{name:'notifications'}

Pushmidi 各有一个特定于该 API 的额外参数。

对于推送权限,您可以提供 userVisibleOnly 参数。这表示您希望为每条推送消息显示通知,还是能够发送静默推送通知(目前,Chrome 仅支持带通知的推送消息)。您可以按如下方式使用:

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 允许以一致的方式监控权限状态,同时能够支持目前 Web 上提供的各种 API。

这样做的一大优势是,您可以为用户打造更好的体验,仅在用户明显了解您需要额外特权时提示,并在您知道已获得权限时充分利用这些 API。

您可以点击此处查看完整示例

浏览器支持

Chrome 是第一个实现此功能的浏览器,Mozilla 计划推出此功能,Microsoft 也对此 API 表示了兴趣。

已知问题

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