API разрешений для Интернета

Если вы раньше работали с API геолокации , скорее всего, вы хотели проверить, есть ли у вас разрешение на использование геолокации, не вызывая запроса. Это просто было невозможно. Вам нужно было запросить текущую позицию, и это указывало бы состояние разрешения или вызывало отображение запроса для пользователя.

Не все API работают таким образом. API уведомлений имеет собственный способ проверки текущего состояния разрешений через Notification.permission .

По мере того, как веб-платформа расширяет API, у разработчиков должен быть единый стандартный способ проверки статуса разрешения, а не запоминать, как работает каждый API. API разрешений , доступный в Chrome версии 43 , предназначен для использования в качестве единственного стандартного способа проверки статуса разрешений API.

разрешения.запрос()

Проверьте статус разрешения с помощью метода 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 , в котором вы определяете имя разрешения. Ответом является обещание, преобразующееся в объект PermissionStatus . Из этого объекта вы можете проверить состояние с помощью permissionStatus.state на предмет «разрешено», «отказано» или «подсказка». Вы также можете реализовать обработчик событий для permissionStatus.onchange и обрабатывать изменения состояния разрешения.

Поддерживаемые дескрипторы разрешений

В приведенном выше примере мы показываем, как запросить состояние разрешения для геолокации с помощью следующего дескриптора разрешения: {name:'geolocation'} .

Дескриптор разрешения на уведомление аналогичен тем, что для него требуется только атрибут имени: {name:'notifications'} .

У Push и MIDI есть дополнительный параметр, специфичный для этого API.

Для разрешения push вы можете указать параметр userVisibleOnly . Это указывает, хотите ли вы показывать уведомление для каждого push-сообщения или иметь возможность отправлять push-уведомления без звука (на данный момент Chrome поддерживает только push-сообщения с уведомлениями). Вы бы использовали это так:

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');
});

Дело в том, что API разрешений позволяет единообразным образом отслеживать состояние разрешений, одновременно поддерживая ряд API, которые в настоящее время доступны в Интернете.

Большим преимуществом этого является то, что это позволяет вам создавать более удобные условия для ваших пользователей, запрашивая только тогда, когда пользователю очевидно, почему вам нужны дополнительные привилегии, и в полной мере использовать преимущества этих API, когда вы знаете, что вам предоставлено разрешение.

Полный набор примеров вы можете найти здесь .

Поддержка браузера

Chrome — первый браузер, реализующий это, Mozilla планирует выпустить его, а Microsoft проявила интерес к этому API.

Известные проблемы

  • Геолокация не будет повторно отображать запрос, если пользователь отклонит запрос на разрешение. Однако статус разрешения остается «быстрым». [ bugs.chromium.org ]