Se você já trabalhou com a API Geolocation, provavelmente já quis verificar se tinha permissão para usar a Geolocation sem gerar uma solicitação. Isso simplesmente não era possível. Você precisava solicitar a posição atual, e isso indicava o estado da permissão ou fazia com que uma solicitação fosse mostrada ao usuário.
Nem todas as APIs funcionam dessa forma. A API Notifications tem uma maneira própria de permitir que você verifique o estado atual da permissão usando Notification.permission.
À medida que a plataforma da Web cresce em APIs, é necessário ter uma única maneira padrão para os desenvolvedores verificarem o status de uma permissão, em vez de precisar lembrar como cada API funciona. A API Permission, disponível na versão 43 do Chrome, tem como objetivo ser o único método padrão para verificar o status de permissão de uma API.
permissions.query()
Verifique o status de uma permissão usando o método permissions.query()
. Isso
retornará um status de concedido (você tem permissão), negado (o acesso à API está bloqueado) ou
solicitar (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
resolvida para um
objeto PermissionStatus. Nesse objeto, é possível verificar o estado com permissionStatus.state
para "granted", "denied" ou "prompt". Também é possível implementar um gerenciador de eventos
para permissionStatus.onchange
e processar mudanças no estado
da permissão.
PermissionDescriptors compatíveis
No exemplo acima, destacamos como consultar o estado da permissão para
geolocalização com o seguinte descritor de permissão: {name:'geolocation'}
.
O descritor de permissão de notificação é semelhante, já que requer apenas um
atributo de nome: {name:'notifications'}
.
Push e midi têm um parâmetro adicional 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. Você usaria da seguinte forma:
navigator.permissions.query({name:'push', userVisibleOnly:true})
O Midi permite um parâmetro sysex
. Isso indica se você precisa e/ou recebe
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 mostraria uma solicitação de permissão quando você chamasse getCurrentPosition()
.
navigator.geolocation.getCurrentPosition(function(position) {
console.log('Geolocation permissions granted');
console.log('Latitude:' + position.coords.latitude);
console.log('Longitude:' + position.coords.longitude);
});
As notificações acionavam o usuário quando você chamava 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');
});
O ponto aqui é que a API Permission permite uma maneira consistente de monitorar o status das permissões, além de oferecer suporte à variedade de APIs atualmente na Web.
A grande vantagem disso é que você pode criar experiências melhores para os usuários, solicitando apenas quando for óbvio para o usuário por que você precisa de privilégios extras e aproveitando ao máximo essas APIs quando você souber que recebeu a permissão.
Confira um conjunto completo de exemplos aqui.
Compatibilidade com navegadores
O Chrome é o primeiro navegador a implementar isso. A Mozilla está planejando o envio, e a Microsoft demonstrou interesse na API.
Problemas conhecidos
- A geolocalização não vai mostrar novamente um aviso se o usuário dispensar a solicitação de permissão. No entanto, o status da permissão permanece como "prompt". [bugs.chromium.org]