Permissions API

Permissions API

这篇文章翻译自HTML5ROCKS的Permissions API

如果你以前使用过Geolocation API,那么你很可能希望可以检查自己是否有权限来使用Geolocation API并且不展示确认框。这个简单的愿望目前是不可能的。你必须要先请求获取目前的位置,然后或许能拿到位置,这表示你有权限。也有可能弹出一个确认框给用户确认是否给权限。

并不是所有的API都是这样工作的。Notification API提供了Notification.permission来让你可以检查自己是否有权限。

Web平台的API一直在发展,现在有必要提供一个标准的方法来让开发者统一检查权限。而不是记住每种API的使用方法。Chrome 43版本提供了Permision API,这个APi提供了统一的方法来检查权限状态。

permissions.query()

permissions.query()方法可以用来检查是否有权限。它会返回三种状态:granted(有权限)、denied(没有权限)或者prompt(需要用户确认)。例如:

// Check for Geolocation API permissions
navigator.permissions.query({name:'geolocation'}).then(function(permissionStatus)
{
    console.log('geolocation permission status is ', permissionStatus.status);
    permissionStatus.onchange = function() {
        console.log('geolocation permission status has changed to ', this.status);
    };
});

query方法的输入是一个PermissionDescripter对象,你可以在这个对象上定义权限的名字。方法的返回结果是一个Promise对象,用于异步获取PermissionStatus对象。你可以检查这个对象的status值来检查权限。你也可以监听permissionStatus.onchange事件,来处理权限状态改变的情况。

支持的PermissionDescriptors

在上面的样例中,我们知道了如何检查Geolocation API的权限,所用的权限描述对象为:{name:'geolocation'}

Notification API的权限描述对象也是类似的,只需要一个name属性:{name:'notifications'}

Pushmidi API则有一个各自特有的额外参数。

对于Push API的权限检查,你可以提供一个userVisible参数。这个参数表明了你是否想让每条信息都显示一个通知,如果不显示通知则便是静默处理每条push信息(目前Chrome仅仅支持有通知的push信息)。你可以这样使用:

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

Midi API有一个sysex参数。这个参数表明了你是否需要系统排除信息。Midi的权限检查方法如下:

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

请求获取权限

对用户来说,请求获取指定API权限的方法都各不相同。例如,Geolocation API会在你调用getCurrentPosition()时弹出一个确认框给用户。

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

在调用Notification.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正在计划提供这个功能,并且Microsoft也对这个API感兴趣。

已知的问题

Geolocation API在用户忽略权限确认框后,再次请求不会显示确认框。并且这是Permission状态值为prompt。这显然是不合理的。[crbug.com/476509]

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • GA源代码里的小技巧之Beacon请求

    GA监控脚本一般都放在开发者的网页上。域名往往和Google不一样,这样发送请求到Google服务器的时候会涉及到跨域。普通的Ajax请求是做不到的,通常称这种...

    mmzhou
  • 原型链上的DOM Attributes

    Chrome开发小组最近发表声明他们正在將DOM properties移动到原型链中。这个更新将会在Chrome 43(2015年4月发布beta版本)中实现。...

    mmzhou
  • 0.1+0.2=0.30000000000000004问题的探究

    首先声明这不是bug,原因在与十进制到二进制的转换导致的精度问题!其次这几乎出现在很多的编程语言中:C/C++,Java,Javascript中,准确的说:“使...

    mmzhou
  • MySQL权限管理的一些自助化服务思路

    今天在帮一位开发同学处理一个权限问题的时候,无意中想起来在2年前一位DBA同事的抱怨,问题的大概背景是:有一位开发同学发来了一些IP,让DBA帮忙看看这些I...

    jeanron100
  • Android 6.0 Permission权限与安全机制

    Marshmallow版本权限修改   android的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次。一旦安装了,app可以在用户毫不知晓...

    庞小明
  • [005]frameworks/ml引发的思考

    Android P上介绍了那么多有关AI的功能,但是真正看起来,Android上AI还处于初级阶段,Android 8.0之后的源码中有一个新增目录:frame...

    王小二
  • RNN Layer

    假设x的shape是[10, 3, 100],翻译一下就是,10个单词,每次训练3句话,每个单词用一个100维的tensor来表达

    mathor
  • TCP三次握手和四次挥手

    TCP三次握手 所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的...

    武培轩
  • SQL Server安全(2/11):身份验证(Authentication)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切。但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念。这篇...

    逸鹏
  • 紧急预警 | Windows 远程桌面服务代码执行漏洞风险预警(CVE-2019-0708)

    近日,腾讯云安全中心监测到微软应急响应中心近日披露了Windows Server 2003, Windows Server 2008 R2 及 Windows...

    腾讯云安全

扫码关注云+社区

领取腾讯云代金券