Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Permissions API #13

Open
zmmbreeze opened this issue Aug 31, 2016 · 0 comments
Open

Permissions API #13

zmmbreeze opened this issue Aug 31, 2016 · 0 comments

Comments

@zmmbreeze
Copy link
Owner

以前的旧文章,转移到这里
这篇文章翻译自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]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant