Si ya trabajaste con la API de Geolocation, es probable que hayas querido verificar si tenías permiso para usar Geolocation sin generar un mensaje. Esto simplemente no era posible. Debiste solicitar la posición actual, lo que indicaría el estado del permiso o haría que se le mostrara un mensaje al usuario.
No todas las APIs funcionan de esta manera. La API de notificaciones tiene su propia forma de permitirte verificar el estado actual del permiso a través de Notification.permission.
A medida que la plataforma web crece en APIs, debe haber una forma única y estándar para que los desarrolladores verifiquen el estado de un permiso en lugar de tener que recordar cómo funciona cada API. El objetivo de la API de permisos, disponible en la versión 43 de Chrome, es ser esta única forma estándar de verificar el estado de los permisos de una API.
permissions.query()
Verifica el estado de un permiso con el método permissions.query()
. Esto mostrará un estado de otorgado (tienes permiso), rechazado (no puedes acceder a la API) o solicitud (se le debe solicitar al usuario). Por ejemplo:
// 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);
};
});
El método de consulta toma un objeto PermissionDescriptor, en el que defines el nombre del permiso. La respuesta es una promesa que se resuelve en un objeto PermissionStatus. Desde este objeto, puedes verificar el estado con permissionStatus.state
para "granted", "denied" o "prompt". También puedes implementar un controlador de eventos para permissionStatus.onchange
y controlar los cambios en el estado de los permisos.
PermissionDescriptors compatibles
En el ejemplo anterior, destacamos cómo consultar el estado del permiso de la ubicación geográfica con el siguiente descriptor de permiso: {name:'geolocation'}
.
El descriptor de permisos de notificación es similar en cuanto a que solo requiere un atributo de nombre: {name:'notifications'}
.
Push y midi tienen un parámetro adicional específico de esa API.
Para el permiso de envío, puedes proporcionar un parámetro userVisibleOnly
.
Indica si deseas mostrar una notificación para cada mensaje de aplicación o si deseas poder enviar notificaciones push silenciosas (por el momento, Chrome solo admite mensajes push con notificaciones). Puedes usarlo de la siguiente manera:
navigator.permissions.query({name:'push', userVisibleOnly:true})
Midi permite un parámetro sysex
. Indica si necesitas enviar o recibir mensajes exclusivos del sistema. Para MIDI, sería lo siguiente:
navigator.permissions.query({name:'midi', sysex:true})
Solicitud de permisos
La solicitud de permiso al usuario depende de la API específica. Por ejemplo, la ubicación geográfica mostraría un mensaje de permiso cuando llames a getCurrentPosition()
.
navigator.geolocation.getCurrentPosition(function(position) {
console.log('Geolocation permissions granted');
console.log('Latitude:' + position.coords.latitude);
console.log('Longitude:' + position.coords.longitude);
});
Mientras que las notificaciones le informarían al usuario cuando llames a 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');
});
El punto aquí es que la API de Permission permite una forma coherente de supervisar el estado de los permisos y, al mismo tiempo, admitir la variedad de APIs que se encuentran actualmente en la Web.
La gran ventaja de esto es que te permite crear mejores experiencias para tus usuarios, solo cuando es obvio para el usuario por qué necesitas privilegios adicionales y aprovechar al máximo estas APIs cuando sabes que se te otorgó permiso.
Puedes encontrar un conjunto completo de ejemplos aquí.
Navegadores compatibles
Chrome es el primer navegador en implementar esto, Mozilla planea lanzarlo y Microsoft mostró interés en la API.
Problemas conocidos
- La geolocalización no volverá a mostrar un mensaje si el usuario rechaza la solicitud de permiso. Sin embargo, el estado del permiso sigue siendo "solicitud". [bugs.chromium.org]