如果您以前使用过 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'}
。
Push 和 midi 都有一个专用于该 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]