API Permissions para a Web

Se você já trabalhou com a API Geolocation, provavelmente quer verificar se tinha permissão para usar a geolocalização sem gerar uma solicitação. Isso não era possível. Você precisava solicitar a posição atual, e isso indicaria o estado da permissão ou faria com que uma solicitação fosse exibida ao usuário.

Nem todas as APIs funcionam dessa forma. A API Notifications tem a própria maneira de permitir que você verifique o estado de permissão atual usando Notification.permission.

À medida que a plataforma da Web cresce em APIs, é necessário que haja uma maneira única e padrão para os desenvolvedores verificarem o status de uma permissão, em vez de terem que se lembrar de como cada API funciona. A API Permission, disponível no Chrome versão 43, foi destinada a ser essa única maneira padrão de verificar o status de permissão de uma API.

permissions.query()

Verificar o status de uma permissão usando o método permissions.query(). Isso retornará um status de concedido (você tem permissão), negado (você está impedido de acessar a API) ou prompt (o usuário precisa ser solicitado). Exemplo:

// 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);
    };
    });

O método de consulta usa um objeto PermissionDescriptor, em que você define o nome da permissão. A resposta é uma promessa que é resolvida em um objeto PermissionStatus. Nesse objeto, é possível verificar o estado com permissionStatus.state para "concedido", "negado" ou "prompt". Você também pode implementar um manipulador de eventos para permissionStatus.onchange e processar mudanças no estado de permissão.

PermissionDescriptors com suporte

No exemplo acima, destacamos como consultar o estado de permissão para geolocalização com o seguinte descritor de permissão: {name:'geolocation'}.

O descritor de permissão de notificações é semelhante, porque exige apenas um atributo de nome: {name:'notifications'}.

Push e midi têm outro parâmetro específico para essa API.

Para a permissão de push, é possível fornecer um parâmetro userVisibleOnly. Isso indica se você quer mostrar uma notificação para cada mensagem push ou enviar notificações push silenciosas. No momento, o Chrome só oferece suporte a mensagens push com notificações. Use o código da seguinte forma:

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

O MIDI permite um parâmetro sysex. Isso indica se você precisa receber e/ou receber mensagens exclusivas do sistema. Para midi, seria:

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

Como solicitar permissões

A solicitação de permissão do usuário depende da API específica. Por exemplo, a geolocalização mostra uma solicitação de permissão quando você chama getCurrentPosition().

navigator.geolocation.getCurrentPosition(function(position) {
    console.log('Geolocation permissions granted');
    console.log('Latitude:' + position.coords.latitude);
    console.log('Longitude:' + position.coords.longitude);
});

Já as notificações solicitam ao usuário quando você chama 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');
});

A questão aqui é que a API Permission permite uma maneira consistente de monitorar o status das permissões e, ao mesmo tempo, oferecer suporte ao intervalo de APIs atualmente na Web.

A grande vantagem disso é que ele permite criar experiências melhores para os usuários, fazendo solicitações apenas quando é óbvio para o usuário por que você precisa de privilégios extras e aproveitando ao máximo essas APIs quando sabe que recebeu a permissão.

Você encontra um conjunto completo de exemplos aqui.

Compatibilidade com navegadores

O Chrome é o primeiro navegador a implementar isso. O Mozilla planeja oferecer isso e a Microsoft mostrou interesse na API.

Problemas conhecidos

  • A geolocalização não vai mostrar novamente uma solicitação se o usuário dispensar a solicitação de permissão. No entanto, o status de permissão continua sendo "prompt". [bugs.chromium.org]