Saltar al contenido
WebViewGold Del vibe coding a la App Store
Español
Consigue WebViewGold

Claude Code + contactos

Acceso a contactos en tu app de Claude Code, sin rechazos por privacidad

Las pantallas para encontrar amigos, las invitaciones a grupos y las apps para dividir gastos suelen querer acceder a la agenda. En una app WebViewGold, tu app de Claude Code pide permiso con requestcontactpermission:// y, tras readcontacts://, recibe los nombres y números de teléfono como JSON en la variable contacts. El código lleva minutos; lo que decide si la app supera la revisión es cómo usas los datos.

Desde $109 de pago único por plataforma, o deja que nuestro equipo lo haga todo desde $698.

  • Garantía de aprobación – o te devolvemos el dinero en 14 días
  • Sin programar
  • Pago único, actualizaciones gratuitas
  • Soporte humano 24/7
  • Hecho en Alemania desde 2014 · ISO 27001

Cuándo merece la pena leer los contactos

Encontrar amigos que ya usan la app

Compara números de teléfono normalizados con las cuentas de tu backend y muestra "3 de tus contactos ya están aquí" en lugar de una lista de amigos vacía.

Invitar a una persona cada vez

El usuario elige un contacto, la app prepara una invitación personal y abre la hoja de compartir. Sin invitaciones masivas ni sorpresas para quien la recibe.

Añadir rápido un cliente o un compañero de equipo

Las apps de CRM, de reservas y de equipos pueden rellenar un registro nuevo a partir de un contacto elegido, en lugar de obligar a los usuarios a volver a escribir nombres y números.

A menudo no lo necesitas

Un simple enlace de invitación a través de la hoja de compartir nativa (shareapp://) no necesita ningún permiso y es el camino más fácil para pasar la revisión. Pide acceso a los contactos solo cuando la búsqueda de coincidencias o la selección aporten valor real.

Prompt para Claude Code

Pega esto en Claude Code para implementar la parte de la web app. Revisa el resultado, publica y luego prueba dentro de la app WebViewGold.

Prompt para Claude Code
Prompt para Claude Code: Lee https://www.webviewgold.com/docs/iOS/contacts/ y https://www.webviewgold.com/docs/android/contacts/. Después: 1) Construye un flujo de contactos: pantalla explicativa; Continuar navega a requestcontactpermission:// (solo cuando navigator.userAgent contenga mi token personalizado de WebViewGold); Cargar contactos restablece window.contacts, navega a readcontacts:// y consulta durante un máximo de 5 segundos; null significa que no hay permiso, así que ofrece settingsapp://. 2) Selector con búsqueda, sin nada preseleccionado y sin Seleccionar todo. 3) Un endpoint de coincidencias para números normalizados en E.164 que devuelva solo las coincidencias, no guarde ni registre nada y tenga límite de frecuencia; escribe tests exactamente para eso. 4) Invitaciones por contacto mediante shareapp://message?=TEXT&url=INVITE_URL. 5) Redacta el párrafo de la política de privacidad, las respuestas de App Privacy y Data safety y las notas para App Review sobre los contactos (estas en inglés, porque los revisores leen inglés). 6) Si los proyectos nativos están en este repositorio, añade READ_CONTACTS a AndroidManifest.xml y una descripción de uso de contactos específica a Info.plist, y enséñame el diff.

¡Estoy muy feliz de haber comprado esta aplicación! Documentación extremadamente fácil y excelente. Estaba en contacto con el servicio al cliente, respondieron muy rápido y de forma muy amigable. Resolvieron mi pregunta en un día. 10/10 lo recomendaría".

Nelis Geiger · CodeCanyon

Pide, lee y usa los contactos de forma responsable

Una hora para el código, algo más para los textos de privacidad.

  1. Declara el permiso

    Android: añade android.permission.READ_CONTACTS a AndroidManifest.xml, como exige la documentación de WebViewGold. iOS: la descripción de uso de contactos en Info.plist debe explicar el motivo, por ejemplo "para mostrarte cuáles de tus contactos ya usan la app".

  2. Primero explica, luego pide

    Muestra una pantalla propia que explique el beneficio, con un botón Continuar, y después navega a requestcontactpermission://. No lo pidas nunca en el primer inicio ni antes de que el usuario llegue a la función.

  3. Lee la agenda

    Con el permiso concedido, navega a readcontacts://. WebViewGold rellena la variable global contacts con un objeto de nombres y arrays de números de teléfono; sin permiso, su valor es null.

  4. Deja que el usuario elija

    Muestra una lista con búsqueda, sin nada preseleccionado y sin botón Seleccionar todo, y enseña el texto exacto de la invitación antes de enviar nada.

  5. Envía solo lo que la función necesita

    Para encontrar amigos, normaliza los números y envíalos a tu backend para una comparación puntual; no guardes los números sin coincidencia. Para las invitaciones, no envíes nada: abre la hoja de compartir.

Pide, lee y transforma los contactos

Dos toques separados: uno para el permiso y otro para cargar la lista. La variable contacts llega de forma asíncrona. La búsqueda de amigos, si la necesitas, se ejecuta en el servidor y solo para usuarios con sesión iniciada; en tu proyecto de Claude Code, eso significa: Tus propias rutas de API, funciones serverless o Supabase.

javascript
var IN_APP = navigator.userAgent.indexOf("WebViewGold") !== -1; // tu token de user agent personalizado

function waitFor(name, timeoutMs, done) {
  var start = Date.now();
  (function check() {
    if (typeof window[name] !== "undefined") { done(window[name]); }
    else if (Date.now() - start < timeoutMs) { setTimeout(check, 100); }
    else { done(undefined); }
  })();
}

// Toque 1: después de tu propia pantalla explicativa
function askForContacts() {
  if (!IN_APP) { showInviteLink(); return; }
  window.location.href = "requestcontactpermission://";
}

// Toque 2: "Mostrar mis contactos"
function loadContacts() {
  window.contacts = undefined;
  window.location.href = "readcontacts://";
  waitFor("contacts", 5000, function (list) {
    if (!list) { showPermissionHint(); return; } // null = sin permiso
    // formato: { "John Appleseed": ["888-555-5512", "888-555-1212"], ... }
    var people = Object.keys(list).map(function (n) { return { name: n, phones: list[n] }; });
    renderPicker(people); // nada preseleccionado, sin "Seleccionar todo"
  });
}

// ¿Lo rechazó antes? Deja que el usuario lo cambie en Ajustes
function openAppSettings() { window.location.href = "settingsapp://"; }

Lo que revisan Apple y Google

  • Directriz 5.1.1 de Apple: pide acceso en contexto, solo para funciones que lo necesiten, con una descripción de uso que explique para qué. Las descripciones vagas son un motivo de rechazo frecuente.
  • Directriz 5.1.2 de Apple: no uses los contactos para crear una base de datos de contactos ni para cedérsela a terceros, y contacta con personas solo por iniciativa explícita e individual del usuario: sin Seleccionar todo, sin contactos preseleccionados y mostrando lo que dirá el mensaje. Consulta el texto vigente de la directriz antes de enviar la app.
  • Política de datos de usuario de Google Play: los datos de la agenda son personales y sensibles. Si los subes, muestra una divulgación destacada dentro de la app antes de la solicitud de permiso y declara Contactos en el formulario Data safety.
  • Aplicar un hash a los números de teléfono no es anonimizarlos, porque el espacio de números es pequeño. Trata los hashes como datos personales, consérvalos solo el tiempo necesario e inclúyelos en tu política de privacidad y en la eliminación de cuentas (consulta la guía de eliminación de cuentas).
  • Desde iOS 18, los usuarios pueden compartir solo los contactos que elijan. Asegúrate de que la función funcione con una lista corta y no insistas en pedir acceso completo.

Preguntas frecuentes

¿Qué devuelve readcontacts://?

Un objeto JSON con el nombre de cada contacto como clave y un array de números de teléfono para cada uno, guardado en la variable global contacts. Sin permiso, la variable es null. Los correos electrónicos, las direcciones postales y las fotos no forman parte del formato documentado.

¿Rechazará Apple una app que lee contactos?

No por leerlos, pero a menudo por cómo lo hace. Pide acceso en contexto con una descripción de uso clara, deja que los usuarios elijan personas concretas, no invites nunca a todos a la vez y no guardes la agenda en tu servidor salvo que la función lo necesite y tu política de privacidad lo indique.

¿Necesito acceso a los contactos para una función de invitación?

A menudo no. Una hoja de compartir con un enlace de invitación personal llega a WhatsApp, Mensajes y el correo sin ningún permiso y es mucho más fácil de explicar en la revisión. Usa el acceso a contactos cuando busques amigos o crees grupos a partir de contactos existentes.

¿Qué pasa si el usuario dice que no?

En ese caso, readcontacts:// deja la variable contacts en null. Ofrece el enlace de invitación en su lugar y, si el usuario cambia de opinión más adelante, abre los ajustes de la app con settingsapp:// para que pueda conceder el acceso.

Tres formas de llevar tu app a las tiendas

El mismo resultado, con distinta cantidad de trabajo por tu parte. Las tres incluyen la garantía de aprobación y soporte humano 24/7.

Hazlo tú mismo

$109 por plataforma, pago único

La licencia de WebViewGold: un proyecto de Xcode o Android Studio listo para usar. Pega tu URL, define nombre e icono, activa funciones, compila y envía. Actualizaciones gratuitas para siempre.

Ver planes en la página principal

Full Service

$698 por plataforma $798

Envíanos tu URL y tu icono. Nuestro equipo configura, compila y entrega tu app en 72 horas, en marca blanca y con los proyectos fuente. Ambas plataformas por $1,158.

Detalles del Full Service Con tecnología de WeSetupYourWebViewApp

Precios de la Oferta de invierno válidos hasta el 31 de diciembre de 2026.

¿Listo para lanzar tu app de Claude Code?

Garantía de aprobación en App Store & Google Play – o te devolvemos el dinero en 14 días

¿Prefieres delegarlo? Full Service: configuramos, compilamos y entregamos en 72 horas, desde $698 por plataforma. ¿Preguntas? Chatea con nosotros 24/7.

Los reembolsos se conceden bajo las condiciones indicadas en nuestras FAQ: un rechazo por motivos ajenos al contenido por parte de Apple y/o Google, reclamado dentro de los 14 días posteriores a la compra.