Nota del autor: Las tecnologías y procesos descritos en este artículo son experimentales y solo funcionarán en unos pocos navegadores. Al momento de escribir este artículo, la API Contact Picker solo era compatible con Android Chrome (a partir de la versión 80) y iOS Safari (a partir de la versión 14.5, pero solo detrás de una bandera). Si desea revisar la funcionalidad, puede consultar una demostración en ejecución en mi sitio web.
La lectura de entradas de la lista de contactos en un teléfono o tableta tradicionalmente se ha limitado a aplicaciones nativas. Pero con la API Contact Picker, podemos hacer precisamente eso usando JavaScript.
Esta característica puede ser interesante en aplicaciones que necesitan información de contacto como números de teléfono o VoIP, redes sociales donde queremos descubrir personas conocidas o aplicaciones que requieren completar información de formulario sin intercambiar aplicaciones para ver los datos.
La API y el dispositivo limitarán las propiedades que estarán disponibles. Hay cinco estándares que los desarrolladores pueden seleccionar:
Los plurales aquí son importantes, ya que un contacto puede tener más de un teléfono, correo electrónico o varias direcciones. Los datos devueltos siempre estarán dentro de matrices para mantener la coherencia, incluso si se trata de un valor único. Más sobre eso más adelante.
La información de contacto almacenada en un teléfono puede contener información sensible que debemos tratar con cuidado. Por eso, existen consideraciones de privacidad y seguridad que debemos tener en cuenta:
La primera vez que utilizan un sitio web que utiliza la API Contact Picker, es posible que reciban un mensaje como este:
El teléfono mostrará esta ventana emergente cada vez hasta que el usuario toque "Permitir". La API del Selector de contactos no se ejecutará hasta que eso suceda. Lo cual es bueno; Queremos asegurarnos de que los usuarios otorguen los permisos adecuados. También es bueno que sea algo único; otorgar autorización cada vez que la página ejecuta el código API de Contact Picker sería un dolor de cabeza.
La API del Selector de contactos solo define dos métodos:
Ambos métodos devuelven promesas, pero teniendo en cuenta que las acciones que desencadenan bloquean el flujo regular de la aplicación, debemos usar async / await al manejarlas.
Puede resultar tentador ignorar getProperties() y solicitar todas las propiedades directamente. Pero tenga cuidado si hace eso: probablemente funcionará, pero si alguna de las propiedades especificadas no está disponible, el método select() generará una excepción.
Una demostración de la API Contact Picker está en acción (ejecútela en línea aquí o mire este video). Si la API es compatible, muestra un botón que lee el número de teléfono, el nombre y el correo electrónico del contacto para mostrarlo.
Primero, necesitamos el botón. Como se detalló anteriormente en la sección Privacidad y seguridad, se requiere una acción del usuario antes de que podamos llamar a la API, por lo que no podemos activar nada sin la interacción del usuario:
El código principal estará en la función getContactData(). Pero antes de eso, ¿cuál sería el punto de mostrar el botón si la API del Selector de contactos no está disponible? Ocultemos el botón si no está disponible. O mejor aún, ocultemos el botón de forma predeterminada (agregando el atributo oculto) y solo lo mostremos si la API está disponible.
// only show the button if browser supports Contact Picker API if ("contacts" in navigator) { document.querySelector("button").removeAttribute("hidden"); }
Ahora que la lógica del botón está implementada, centrémonos en getContactData(). Aquí hay una versión comentada de la función:
// 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) } }
Una vez que el botón activa esta función, y si el navegador tiene permisos (ver captura de pantalla en la sección anterior), aparecerá el modal de contacto, indicando información esencial: la URL que lee los datos, qué datos devolverá y el lista de contactos para elegir.
Después de cerrar el modal, la variable contactos almacenará los datos en JSON como un array con un objeto que contiene la información solicitada (puede estar vacío si no está disponible en la tarjeta de contacto).
Por ejemplo, este es el resultado después de seleccionarme como contacto (datos falsos):
[ { "address": [], "email": [ "[email protected]" ], "icon": [], "name": [ "Alvaro Montoro" ], "tel": [ "555-555-5555", "555-123-4567" ] } ], "icono": [], "nombre":
, "tel":
} ]Si los datos incluyen un ícono, será un blob con la imagen. Si los datos incluyen una dirección, será un objeto más complejo con calle, ciudad, país, código postal, etc. Puede consultar los valores devueltos en la especificación.
Selección de múltiples contactos
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); // ...Es posible seleccionar más de un contacto. Si queremos hacer eso, debemos pasar un segundo parámetro al método navigator.contacts.select() indicando esta opción.
const props = ["tel", "dirección", "icono", "nombre", "correo electrónico"]; // sólo una opción disponible: leer varias o sólo una (predeterminado) opciones constantes = {múltiples: verdadero}; intentar { contactos constantes = espera navigator.contacts.select(accesorios, opciones); //...
El resultado es una serie de contactos, por lo que el resto del código podría seguir siendo el mismo para este ejemplo.
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); // ...El código anterior puede resultar intimidante, principalmente por todos los comentarios que agregué. Aquí hay una versión ligeramente comentada del código anterior. Como podrás notar, es bastante simple:
función asíncrona getContactData() { if ("contactos" en el navegador) { props const = espera navigator.contacts.getProperties(); opciones constantes = {múltiples: verdadero}; intentar { contactos constantes = espera navigator.contacts.select(accesorios, opciones); si (contactos.longitud) { // código que gestiona los datos seleccionados } demás { // código cuando no se seleccionó nada } } atrapar (ej.) { // código si hubo un error } } }
Conclusión: Privacidad frente a piratería
La información de contacto es PII (Información de Identificación Personal), y debemos tratarla con todo el cuidado y seguridad que requieren los datos sensibles.
Obtenga solo los datos que necesita. No seas astuto ni turbio. Obtenga justo lo que necesita para generar credibilidad y confianza.
Supongamos que una aplicación web intenta leer direcciones, nombres o correos electrónicos mientras selecciona un número de teléfono. Si eso me sucediera, automáticamente rechazaría el permiso y abandonaría el sitio web.
Si disfrutaste este artículo sobre JavaScript y te gusta probar las API web y diferentes cosas con JS, consulta este otro artículo:
Desarrollar un juego de Rock Band con HTML y JavaScript
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3