API de Permissions para la Web

Si trabajaste con la API de Geolocation es probable que hayas querido verificar si tenías permiso para usar Geolocation sin generar un mensaje. Simplemente, no era posible. Tenías que solicitar la posición actual, lo que indicaría el estado del permiso o haría que se mostrara un mensaje al usuario.

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

A medida que la plataforma web crece en API, debe haber una forma única y estándar de a los desarrolladores verificar el estado de un permiso en lugar de tener que recordar cómo funcionan todas y cada una de las APIs. La API de Permission, disponible en la versión 43 de Chrome, es era esta forma estándar y única de comprobar el estado de los permisos de una API.

permissions.query()

Verifica el estado de un permiso con el método permissions.query(). Si confirmas esta acción, mostrar un estado de concedido (tienes permiso), denegado (se bloquea desde accede a la API) o mensaje (el usuario necesita que se solicite). 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 PermissionDescriptor objeto, en el que defines el nombre del permiso. La respuesta es una promesa que resuelve a un PermissionStatus . Desde este objeto, puedes verificar el estado con permissionStatus.state. para “concedido”, “rechazado” o "prompt". También puedes implementar un evento controlador de permissionStatus.onchange y controlar los cambios en el permiso para cada estado.

PermissionDescriptors compatibles.

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

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

Envío y midi tienen un valor parámetro 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 enviar notificaciones de aplicación silenciosas (por el momento, solo Chrome admite mensajes push con notificaciones). Se usaría así:

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

Midi admite un parámetro sysex. Esto indica si necesitas o mensajes exclusivos del sistema. En el caso de MIDI, sería:

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

Solicitud de permisos

La solicitud de permiso al usuario depende de la API específica. Por ejemplo: Geolocation mostrará 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);
});

Por otro lado, las notificaciones se le muestran al usuario cuando llamas 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 activadas la Web.

La gran ventaja de esto es que te permite crear mejores experiencias para los usuarios, solo solicitándoles cuando sea evidente por qué se necesitan servicios privilegios y aprovechar al máximo estas APIs cuando sabe que ha estado se le otorgó el permiso.

Puedes encontrar un conjunto completo de ejemplos aquí.

Navegadores compatibles

Chrome es el primer navegador en implementar esto, y Mozilla está planificando y Microsoft demostró interés en la API.

Problemas conocidos

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