Nota do autor: As tecnologias e processos descritos neste artigo são experimentais e funcionarão apenas em alguns navegadores. No momento em que este artigo foi escrito, a API Contact Picker era suportada apenas pelo Android Chrome (a partir da versão 80) e iOS Safari (a partir da versão 14.5, mas apenas atrás de uma bandeira). Se quiser revisar a funcionalidade, você pode conferir uma demonstração em execução no meu site.
A leitura de entradas da lista de contatos em um telefone ou tablet tem sido tradicionalmente limitada a aplicativos nativos. Mas com a API Contact Picker, podemos fazer exatamente isso usando JavaScript.
Esse recurso pode ser interessante em aplicativos que precisam de informações de contato como números de telefone ou VoIP, redes sociais onde queremos descobrir pessoas conhecidas ou aplicativos que exigem o preenchimento de informações de formulários sem trocar de aplicativo para visualizar os dados.
A API e o dispositivo limitarão quais propriedades estarão disponíveis. Existem cinco padrões que os desenvolvedores podem selecionar:
Os plurais aqui são importantes, pois um contato pode ter mais de um telefone, e-mail ou vários endereços. Os dados retornados sempre estarão dentro de arrays para consistência, mesmo que seja um valor único. Mais sobre isso mais tarde.
As informações de contato armazenadas em um telefone podem conter informações confidenciais que devemos tratar com cuidado. Por isso, há considerações de privacidade e segurança que devemos levar em consideração:
Na primeira vez que eles usam um site que usa a API Contact Picker, eles podem receber uma mensagem como esta:
O telefone exibirá esse pop-up sempre que o usuário tocar em "Permitir". A API Contact Picker não será executada até que isso aconteça. O que é bom; queremos garantir que os usuários concedam as permissões adequadas. Também é bom que seja algo único; conceder autorização cada vez que a página executa o código da API do Contact Picker seria uma dor de cabeça.
A API Contact Picker define apenas dois métodos:
Ambos os métodos retornam promessas, mas levando em consideração que as ações que eles acionam bloqueiam o fluxo regular do aplicativo, devemos usar async / await ao manipulá-los.
Pode ser tentador ignorar getProperties() e solicitar todas as propriedades diretamente. Mas cuidado se você fizer isso: provavelmente funcionará, mas se alguma das propriedades especificadas não estiver disponível, o método select() lançará uma exceção.
Uma demonstração da API Contact Picker está em ação (execute-a online aqui ou assista a este vídeo). Se a API for suportada, ela mostra um botão que lê o número de telefone, nome e e-mail do contato para exibi-lo.
Primeiro, precisamos do botão. Conforme detalhado anteriormente na seção Privacidade e segurança, é necessária uma ação do usuário antes de podermos chamar a API, portanto, não podemos acionar nada sem a interação do usuário:
O código principal estará na função getContactData(). Mas antes disso, de que adiantaria mostrar o botão se a API Contact Picker não estivesse disponível? Vamos ocultar o botão se não estiver disponível. Ou melhor ainda, vamos ocultar o botão por padrão (adicionando o atributo oculto) e mostrá-lo apenas se a API estiver disponível.
// only show the button if browser supports Contact Picker API if ("contacts" in navigator) { document.querySelector("button").removeAttribute("hidden"); }
Agora que a lógica do botão está implementada, vamos nos concentrar em getContactData(). Aqui está uma versão comentada da função:
// it is asynchronous because we'll wait for the modal selection async function getContactData() { // indicate what contact values will be read const props = ["tel", "name", "email"]; // wrap everything in a try...catch, just in case try { // open the native contact selector (after permission is granted) const contacts = await navigator.contacts.select(props); // this will execute after the native contact selector is closed if (contacts.length) { // if there's data, show it alert("Selected data: " JSON.stringify(contacts)); } else { // ...if not, indicate nothing was selected alert("No selection done"); } } catch (ex) { // if something fails, show the error message alert(ex.message) } }
Uma vez que o botão acione esta função, e se o navegador tiver permissões (veja captura de tela na seção anterior), o modal de contato aparecerá, indicando informações essenciais: a URL que lê os dados, quais dados ele retornará e o lista de contatos para escolher.
Após fechar o modal, a variável contatos armazenará os dados em JSON como um array com um objeto contendo as informações solicitadas (pode ficar vazio caso não esteja disponível no cartão de contato).
Por exemplo, este é o resultado após me selecionar como contato (dados falsos):
[ { "address": [], "email": [ "[email protected]" ], "icon": [], "name": [ "Alvaro Montoro" ], "tel": [ "555-555-5555", "555-123-4567" ] } ], "ícone": [], "nome":
, "tel":
} ]Se os dados incluírem um ícone, será um blob com a imagem. Se os dados incluírem um endereço, será um objeto mais complexo com rua, cidade, país, CEP, etc. Você pode verificar os valores retornados na especificação.
Selecionando vários contatos
const props = ["tel", "address", "icon", "name", "email"]; // only one option available: read multiple or only one (default) const options = { multiple: true }; try { const contacts = await navigator.contacts.select(props, options); // ...É possível selecionar mais de um contato. Se quisermos fazer isso, precisamos passar um segundo parâmetro para o método navigator.contacts.select() indicando esta opção.
const props = ["tel", "endereço", "ícone", "nome", "e-mail"]; // apenas uma opção disponível: leitura múltipla ou apenas uma (padrão) opções const = {múltiplo: verdadeiro}; tentar { contatos const = aguardar navigator.contacts.select(adereços, opções); // ...
O resultado é uma matriz de contatos, portanto o restante do código pode permanecer o mesmo neste exemplo.
const props = ["tel", "address", "icon", "name", "email"]; // only one option available: read multiple or only one (default) const options = { multiple: true }; try { const contacts = await navigator.contacts.select(props, options); // ...O código acima pode ser intimidante, principalmente por causa de todos os comentários que adicionei. Aqui está uma versão levemente comentada do código acima. Como você pode notar, é bem simples:
função assíncrona getContactData() { if ("contatos" no navegador) { const adereços = aguardar navigator.contacts.getProperties(); opções const = {múltiplo: verdadeiro}; tentar { contatos const = aguardar navigator.contacts.select(adereços, opções); if (contatos.comprimento) { //código gerenciando os dados selecionados } outro { //código quando nada foi selecionado } } pegar (ex) { //código se houve algum erro } } }
Conclusão: Privacidade acima da pirataria
As informações de contato são PII (Informações de Identificação Pessoal) e devemos tratá-las com todo o cuidado e segurança que dados confidenciais exigem.
Obtenha apenas os dados que você precisa. Não seja sorrateiro ou obscuro. Obtenha exatamente o que é necessário para construir credibilidade e confiança.
Suponha que um aplicativo da web tente ler endereços, nomes ou e-mails enquanto seleciona um número de telefone. Se isso acontecesse comigo, eu rejeitaria automaticamente a permissão e sairia do site.
Se você gostou deste artigo sobre JavaScript e gosta de testar APIs Web e coisas diferentes com JS, confira este outro artigo:
Desenvolva um jogo Rock Band com HTML e JavaScript
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3