适用于 Web 的 Permissions API

Matt Gaunt

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

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

随着 API 的 Web 平台不断发展,开发者需要采用一种标准方法来检查权限的状态,而不需要记住每个 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);
    };
    });

该查询方法采用 PermissionDescriptor 对象,您可以在其中定义权限的名称。响应是解析为 PermissionStatus 对象的 Promise。在此对象中,您可以使用 permissionStatus.state 检查“granted”“denied”或“prompt”的状态。您还可以为 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 是首款实现此 API 的浏览器,Mozilla 正在计划推出此 API,并且 Microsoft 也已对该 API 表现出兴趣。

已知问题

  • 如果用户忽略了权限请求,地理定位不会重新显示提示。但是,权限状态将仍然为“提示”。[bugs.chromium.org]