Se você já usou a API Geolocation antes, é provável que você queira verificar se tinha permissão para usar geolocalização sem gerar uma solicitação. Isso simplesmente não era possível. Era necessário solicitar a posição atual, e isso indicaria o estado da permissão ou mostraria uma solicitação ao usuário.
Nem todas as APIs funcionam dessa maneira. A API Notifications tem uma maneira própria de permitir verificar o estado atual da permissão por meio de Notification.permission.
À medida que a plataforma da Web cresce em APIs, é necessário que haja uma forma única e padrão de os desenvolvedores verifiquem o status de uma permissão em vez de terem que se lembrar como cada API funciona. A API Permission, disponível no Chrome versão 43, está foi criado como uma maneira única e padrão de 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 vai
retornar um status de concedido (você tem permissão), negado (você está bloqueado para
acessar a API) ou
comando (necessidades do usuário
que 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 recebe uma
PermissionDescriptor
em que você define o nome da permissão. A resposta é uma promessa
resolver em um
PermissionStatus
objeto. A partir desse objeto, é possível conferir o estado com permissionStatus.state
para "concedido", "negado" ou "prompt". Você também pode implementar um evento
gerenciador de permissionStatus.onchange
e processar mudanças na permissão
estado.
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ção é semelhante, porque exige apenas uma
atributo de nome: {name:'notifications'}
.
Push e midi têm um valor adicional específico dessa API.
Para a permissão push, é possível fornecer um parâmetro userVisibleOnly
.
Isso indica se você quer exibir uma notificação para cada mensagem push
ou enviar notificações push silenciosas. No momento, somente o Chrome
oferece suporte a mensagens push com notificações). Você o usaria da seguinte forma:
navigator.permissions.query({name:'push', userVisibleOnly:true})
A Midi permite um parâmetro sysex
. Isso indica se você precisa 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:
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 solicitariam 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 status das permissões, ao mesmo tempo em que é possível dar suporte às APIs atualmente ativas na Web.
A grande vantagem disso é que você pode criar experiências melhores para aos usuários e só fazer uma solicitação quando for óbvio para eles por que você precisa e aproveitar ao máximo essas APIs quando souber que está que você recebeu.
Você encontra um conjunto completo de exemplos aqui.
Compatibilidade com navegadores
O Chrome é o primeiro navegador a implementar esse recurso. A Mozilla planeja lançar e a Microsoft mostrou interesse na API.
Problemas conhecidos
- A geolocalização não mostrará novamente uma solicitação se o usuário dispensar a permissão. solicitação. No entanto, o status de permissão continua sendo "prompt". [bugs.chromium.org]