Если вы раньше работали с 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 ]