這是一個正在研發(fā)中的API,由于這個API的相關(guān)規(guī)范并不穩(wěn)定,各個瀏覽器的支持程度都不一樣(應(yīng)該是大部分瀏覽器都不支持),但這又是一個非常有意思的東西拙友,所以我決定把它分享出來。
Per missions API 的接口提供了一些它的一些核心的方法歼郭,比如查詢(query)或者撤銷(revoke)權(quán)限遗契。
API 方法
Permissions.query() 查詢給定API的權(quán)限狀態(tài),并返回狀態(tài)
Permissions.request() 請求一個給定API的權(quán)限病曾。
Permissions.revoke() 撤銷某個API的權(quán)限
基本概念搞清楚了牍蜂,接下來就該使用這個有意思的東西了。
如果你的程序想運行了一個Geolocation API(獲取地理位置的API)泰涂,正巧你想檢測一下你是否能在不彈出授權(quán)提示的情況下使用這個API鲫竞。這簡直是不可能的事情,你必須先請求當(dāng)前位置逼蒙,這樣才能表明你的權(quán)限狀態(tài)从绘,或者是彈出一個用戶授權(quán)框。當(dāng)然并不是所有的API都是這樣的是牢,比如Notification API(一個為用戶設(shè)置顯示桌面通知的API)就自己提供了一個自己的方法來獲取權(quán)限狀態(tài)Notification.permission僵井。
但是這樣不是太麻煩了么,網(wǎng)絡(luò)平臺的成長與API息息相關(guān)驳棱,我們應(yīng)用一個統(tǒng)一的批什、標(biāo)準(zhǔn)的、符合一致規(guī)范的方法來檢測 API 的權(quán)限社搅。這就是Permissions API驻债。
Permissions.query()
使用Permissions.query() 方法檢測某個權(quán)限的狀態(tài)罵,并返回一個狀態(tài):“許可(granted)”罚渐、“拒絕(denied)”却汉、“需要授權(quán)(prompt)”驯妄。例如:
// 檢測Geolocation API 的權(quán)限狀態(tài)
navigator.permissions.query({name: 'geolocation'}).then(function(result){
console.log('geolocation permission status is ', result.state);
result.status.onchange = function() {
console.log('geolocation permisssion status has changed to ', this.state);
};
});
查詢方法接受一個 PermissionDescriptor 對象作為參數(shù)荷并, 在這個對象里面可以定義自己的權(quán)限名字。返回值 Response 是一個 Promise解析到一個 PermissionStatus對象青扔,在這個PermissionStatus對象里你可以通過他的 state 屬性獲取到權(quán)限狀態(tài)源织,也可以通過這個對象提供的onchange方法監(jiān)聽API權(quán)限狀態(tài)的改變。
peimissionDescriptor 的name屬性提供了四個值如下:
可以通過實例代碼 {name: 'geolocation'} 的形式傳入微猖,除此之外當(dāng)name的值為 ‘push’ 或者 ‘midi’ 的時候擴展了另外兩個參數(shù)谈息,如下:
Requesting Permissions
Requesting Permisssions的方法依賴于用戶請求的特定的API,例如geolocation在調(diào)用它的 getCurrentPosition() 方法的時候?qū)崾菊埱笫跈?quán)凛剥。
navigator.geolocation.getCurrentPosition(function(position) {
console.log('Geolocation permissions granted');
console.log('Latitude:' + position.coords.latitude);
console.log('Longitude:' + position.coords.longitude);
});
然而當(dāng)對于notification API 調(diào)用requestPermission() 方法的時候回彈出授權(quán)請求侠仇。
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');
});
最關(guān)鍵的一點是,Permission API 允許以一個一致的方式來監(jiān)控權(quán)限狀態(tài),同時目前能支持
這帶來的最大的好處就是你能夠為你的用戶建立更好的體驗逻炊,只有當(dāng)用戶清楚為什么需要額外授權(quán)的時候才會彈出授權(quán)提示互亮,并且當(dāng)你已經(jīng)獲取到權(quán)限的時候,你可以更充分的余素,更好的利用這些 已授權(quán)API 豹休。
瀏覽器支持
在前面我已經(jīng)提到過,這是一個正在研發(fā)的 API 桨吊,Chrome是第一個支持這個 API 的瀏覽器威根,而事實上只有 Chrome43+ 支持。然而Firefox以及Microsoft都已經(jīng)在準(zhǔn)備支持這個它视乐。
參考或翻譯:
- https://developer.mozilla.org/en-US/docs/Web/API/Permissions
- https://developers.google.com/web/updates/2015/04/permissions-api-for-the-web
- https://w3c.github.io/permissions/
這里有 Google 的實例:
https://googlechrome.github.io/samples/permissions/