Jeśli korzystasz z interfejsu Geolocation API, prawdopodobnie chcesz sprawdzić, czy masz uprawnienia do korzystania z geolokalizacji bez wyświetlania prośby. To było po prostu niemożliwe. Musisz poprosić o aktualną pozycję, co wskazuje na stan uprawnień lub powoduje wyświetlenie użytkownikowi monitu.
Nie wszystkie interfejsy API działają w ten sposób. Interfejs Notifications API ma własny sposób na sprawdzenie bieżącego stanu uprawnień za pomocą Notification.permission.
Wraz z rozwojem platformy internetowej rośnie liczba interfejsów API, dlatego programiści powinni mieć jeden standardowy sposób sprawdzania stanu uprawnień zamiast zapamiętywać, jak działają poszczególne interfejsy API. Interfejs Permission API, dostępny w wersji Chrome 43, ma być tym jedynym standardowym sposobem sprawdzania stanu uprawnień interfejsu API.
permissions.query()
Sprawdź stan uprawnienia za pomocą metody permissions.query()
. Zwracany stan to granted (przyznano uprawnienia), denied (zablokowano dostęp do interfejsu API) lub prompt (wyświetlono prompt). Na przykład:
// 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);
};
});
Metoda zapytania przyjmuje obiekt PermissionDescriptor, w którym definiujesz nazwę uprawnienia. Odpowiedź to obietnica, która zwraca obiekt PermissionStatus. Z tego obiektu możesz sprawdzić stan za pomocą permissionStatus.state
(„granted” [przyznany], „denied” [odrzucony] lub „prompt” [prompt]). Możesz też zaimplementować w tym celu event handlera permissionStatus.onchange
i obsługiwać zmiany stanu uprawnień.
Obsługiwane obiekty PermissionDescriptor
W tym przykładzie pokazujemy, jak zapytać o stan uprawnień do korzystania z lokalizacji za pomocą tego deskryptora uprawnień: {name:'geolocation'}
.
Opis uprawnień do wysyłania powiadomień jest podobny w tym sensie, że wymaga tylko atrybutu nazwa: {name:'notifications'}
.
Push i midi mają dodatkowe parametry, które są specyficzne dla danego interfejsu API.
W przypadku uprawnień do przesyłania powiadomień push możesz podać parametr userVisibleOnly
.
Określa, czy chcesz wyświetlać powiadomienie dla każdej wiadomości push, czy też wysyłać powiadomienia push bez dźwięku (obecnie Chrome obsługuje tylko wiadomości push z powiadomieniami). Użyjesz go w ten sposób:
navigator.permissions.query({name:'push', userVisibleOnly:true})
Midi pozwala na parametr sysex
. Wskazuje, czy musisz wysyłać lub otrzymywać wiadomości systemowe. W przypadku pliku MIDI będzie to:
navigator.permissions.query({name:'midi', sysex:true})
Wysyłanie prośby o uprawnienia
Prośba o przyznanie uprawnień zależy od konkretnego interfejsu API. Na przykład geolokalizacja wyświetli prośbę o uprawnienia, gdy zadzwonisz do getCurrentPosition()
.
navigator.geolocation.getCurrentPosition(function(position) {
console.log('Geolocation permissions granted');
console.log('Latitude:' + position.coords.latitude);
console.log('Longitude:' + position.coords.longitude);
});
Powiadomienia będą wysyłane do użytkownika, gdy zadzwonisz 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');
});
Chodzi o to, że interfejs Permission API umożliwia spójne monitorowanie stanu uprawnień przy jednoczesnym obsłudze różnych interfejsów API dostępnych obecnie w internecie.
Dużą zaletą jest to, że możesz tworzyć lepsze interfejsy dla użytkowników, wyświetlając prośby tylko wtedy, gdy jest dla nich oczywiste, dlaczego potrzebujesz dodatkowych uprawnień, i w pełni korzystać z tych interfejsów API, gdy wiesz, że masz przyznane uprawnienia.
Pełny zestaw przykładów znajdziesz tutaj.
Obsługa przeglądarek
Chrome jest pierwszą przeglądarką, która to zaimplementowała. Mozilla planuje wdrożenie tej funkcji, a Microsoft wyraził zainteresowanie interfejsem API.
Znane problemy
- Jeśli użytkownik odrzuci prośbę o uprawnienia, geolokalizacja nie wyświetli ponownie monitu. Stan uprawnienia pozostaje jednak „prompt”. [bugs.chromium.org]