網頁適用的 Permissions API

Matt Gaunt

如果您之前使用過 Geolocation API,建議您檢查自己是否已取得使用地理位置權限,而不發出提示。這就不可能做到。您必須要求目前的位置,這樣才會指出權限狀態或導致系統向使用者顯示提示。

並非所有 API 都能以這種方式運作。通知 API 有自己的方式,可讓您透過 Notification.permission 檢查目前的權限狀態。

隨著網路平台不斷擴增,開發人員必須使用單一標準方式檢查權限狀態,而不必記住每個 API 和每個 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 物件,在其中定義權限名稱。回應是 Promise 解析為 PermissionStatus 物件。在這個物件中,您可以透過 permissionStatus.state 檢查「授予」、「拒絕」或「提示」的狀態。您也可以為 permissionStatus.onchange 實作事件處理常式,並處理權限狀態的變更。

支援的 PermissionDescriptors

在上述範例中,我們說明如何使用下列權限描述元,查詢地理位置的權限狀態:{name:'geolocation'}

通知權限描述元與只需要名稱屬性十分相似:{name:'notifications'}

Pushmidi 皆有該 API 專屬的額外參數。

如果是推送權限,您可以提供 userVisibleOnly 參數。這表示您希望在每次收到推播通知時都顯示通知,或能夠傳送無聲推播通知 (Chrome 目前只支援含有通知的推送訊息)。您會希望使用此程式碼:

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

Midi 允許使用 sysex 參數。這表示您需要和/或接收系統專屬訊息。以 中階字元為限:

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 可讓您以一致的方式監控權限狀態,同時還能支援目前網路上的 API 範圍。

這麼做的一大優勢,在於可讓您為使用者打造更優質的體驗,但只有當使用者明確瞭解您需要額外權限的原因時,才會提示他們要求您授予額外權限,並善用這些 API 的好處,因為您已取得授權。

這裡提供完整的範例

瀏覽器支援

Chrome 是第一款導入這項技術的瀏覽器,Mozilla 也預計進行了運送計畫,Microsoft 也表示對這個 API 感興趣。

已知問題

  • 如果使用者關閉權限要求,地理位置功能不會重新顯示提示。不過,權限狀態仍維持「提示」。[bugs.chromium.org]