Permission API 統一查詢許可權狀態

JS菌發表於2019-03-26

20190326225810.png

Permission API 不是一個新的標準,早在 2015 年,就已經成為標準。這個 API 的主要作用就是提供一個統一的查詢 API 許可權的介面。 ?

如果我們使用 Notification API,那麼需要這樣操作:

Notification.requestPermission().then(function (permission) {
    if (permission === 'granted') {
        let notification = new Notification('helloooooo')
    } else if(/* ... */) {
        // ...
    } else {
        // ...
    }
})
複製程式碼

首先要呼叫 requestPermission 方法,然後在回撥函式中檢查 permission 引數是否為 granted 如果是那麼證明已經獲取到許可權,則可以建立 Notification 例項

20190326222057.png

然後再看看 Geolocation API 是如何獲取許可權的:

navigator.geolocation.getCurrentPosition(console.log, console.error)
複製程式碼

20190326222732.png

哦吼?不需要顯式呼叫並驗證是否為獲取到許可權,而是通過回撥函式來做檢查 ?

所以,有的時候就會導致混亂,Permission API 這個玩意就是為了解決這個標準不統一的問題的

那麼具體怎麼用呢 ❓

這裡的 permission 就是指 navigator.permissions 他有一個 query 方法,用來查詢許可權狀態:

navigator.permissions.query({ name: 'geolocation' }).then(status => {
    console.log(`當前狀態 ${status.state}`)
    // status 是一個 PermissionStatus 的例項
})
複製程式碼

接收一個物件,這個物件的屬性 name 為需要查詢的 API 的名稱,效果如下:

20190326223813.png

他有三種狀態分別是:

  • granted
  • denied
  • prompt

這個 PermissionStatus 還有一個 change 的事件,可以監聽這個事件針對許可權變化做進一步處理

同樣的對於 Notification 也是傳入引數到 query 來查詢:

navigator.permissions.query({ name: 'notifications' }).then(status => {
    console.log(`當前狀態 ${status.state}`)
    status.onchange = function() {
        console.log(`狀態改變 ${this.state}`, this.state)
    }
})
複製程式碼

效果如下:

20190326224640.png

當然如果需要獲取許可權,那麼還是需要根據特定的 API 來編寫程式碼,Permission 只提供查詢的功能 ?

補充:

查詢到瀏覽器還支援 navigator.permissions.requestnavigator.permissions.requestAll 方法,用來請求許可權,嘗試如下:

navigator.permissions.request({ name: 'geolocation' }).then(console.log)
複製程式碼

瀏覽器會彈出並詢問是否授權:

20190326232716.png

那麼這樣一來 Permission 還能夠提供請求許可權功能

Permission API 統一查詢許可權狀態

相關文章