API de Permissions para la Web

Si ya trabajaste con la API de Geolocation, es probable que quieras verificar si tenías permiso para usar Geolocation sin mostrar un mensaje. Eso simplemente no era posible. Tenías que solicitar la posición actual, lo cual indicaría el estado del permiso o haría que el usuario viera un mensaje.

No todas las APIs funcionan de esta manera. La API de Notifications tiene su propia forma de permitirte verificar el estado actual del permiso mediante Notification.permission.

A medida que la plataforma web crece en las APIs, es necesario que los desarrolladores tengan una forma única y estándar para verificar el estado de un permiso, en lugar de tener que recordar cómo funciona cada una de ellas. La API de Permission, disponible en la versión 43 de Chrome, está diseñada para ser una forma única y estándar de verificar el estado del permiso de una API.

permissions.query()

Verifica el estado de un permiso con el método permissions.query(). Esto mostrará el estado de concedido (tienes permiso), denegado (no puedes acceder a la API) o solicitud (el usuario debe recibir una solicitud). 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 resuelve 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 del permiso.

PermissionDescriptors admitidos

En el ejemplo anterior, destacamos cómo consultar el estado del permiso para la ubicación geográfica con el siguiente descriptor de permisos: {name:'geolocation'}.

El descriptor de permisos de notificaciones es similar en que solo requiere un atributo de nombre: {name:'notifications'}.

Push y midi tienen, cada uno, un parámetro adicional que es específico de esa API.

Para el permiso de envío, puedes proporcionar un parámetro userVisibleOnly. Esto indica si deseas mostrar una notificación para cada mensaje push o poder enviar notificaciones push silenciosas (por el momento, Chrome solo admite mensajes push con notificaciones). Se usa de la siguiente manera:

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

Midi permite un parámetro sysex. Indica si necesitas o recibir mensajes exclusivos del sistema. En el caso del MIDI sería el siguiente:

navigator.permissions.query({name:'midi', sysex:true})

Solicitud de permisos

La solicitud de permiso del usuario depende de la API específica. Por ejemplo, la ubicación geográfica mostrará una solicitud 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);
});

En cambio, las notificaciones le mostrarán 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 supervisar el estado de los permisos de manera coherente y, al mismo tiempo, admite el rango de APIs que se encuentran actualmente en la Web.

La gran ventaja de esto es que te permite crear mejores experiencias para tus usuarios, ya que solo indica cuando es evidente para el usuario por qué necesitas privilegios adicionales y aprovecha 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 tiene previsto ofrecerlo y Microsoft mostró interés en la API.

Problemas conocidos

  • La ubicación geográfica no volverá a mostrar un mensaje si el usuario descarta la solicitud de permiso. Sin embargo, el estado del permiso sigue siendo "mensaje". [bugs.chromium.org]