Enlaces sms: el mailto: de los mensajes de texto

Pulsas un enlace en una web desde el móvil y se abre la aplicación de mensajes con el número del destinatario y el texto ya escritos, listos para darle a enviar. Sin pasar por WhatsApp, sin copiar el teléfono al portapapeles y sin una línea de JavaScript.

Eso es lo que hace el esquema de URL sms:, el equivalente a mailto: o tel: para mensajes de texto, estandarizado en la RFC 5724.

Cómo funciona

En HTML no necesitas más que un enlace normal con el esquema sms: en el atributo href:

<a href="sms:+34600000000?body=Hola%20Baumann!">Escríbeme por SMS</a>

La estructura tiene dos partes opcionales: el número (o números) de destino después de sms: y el parámetro body en la query string con el contenido del mensaje.

Enlace Qué hace al abrirlo en el móvil
sms: Abre la app de mensajes sin destinatario ni texto
sms:+34600000000 Abre una conversación con ese número
sms:+34600000000?body=Hola%20mundo! Rellena el destinatario y el texto del mensaje

El contenido de body tiene que ir codificado como componente de URI: los espacios son %20, los saltos de línea %0A y cualquier carácter especial pasa antes por encodeURIComponent() si construyes el enlace desde JavaScript.

Por seguridad, ningún sistema operativo envía el SMS automáticamente al tocar el enlace: el navegador solo abre la aplicación de mensajes con los campos rellenos y es el usuario quien pulsa enviar.

El problema de los varios destinatarios en iOS

Según la RFC 5724, para enviar el mismo mensaje a varios números basta con separarlos por comas:

sms:+34600000001,+34600000002?body=Hola%20equipo!

En Android funciona tal cual. En iPhone, no: la app Mensajes de iOS ignora el formato estándar cuando hay más de un número y espera una ruta propia con sms://open y el parámetro addresses:

sms://open?addresses=+34600000001,+34600000002&body=Hola%20equipo!

Si estás leyendo esto desde el móvil, puedes comprobar la diferencia entre los dos enlaces:

La documentación de Apple no ayuda a entender el porqué. Su referencia archivada sobre enlaces SMS solo describe el formato básico con un número de teléfono: no contempla el parámetro body ni varios destinatarios, y sms://open?addresses= no aparece en ella.

Si solo necesitas un destinatario, el problema no te afecta: sms:+34600000000?body=... funciona igual en Android y en iOS.

Cómo generar el enlace para ambos sistemas

Cuando necesitas varios destinatarios no hay feature detection posible desde el navegador: <a> es un enlace pasivo y el DOM no tiene forma de saber cómo va a interpretar la URL la aplicación de mensajes del sistema. El único recurso práctico es comprobar el userAgent:

function smsHref(numbers = [], body = "") {
  const isIOS = /iPhone|iPod/.test(navigator.userAgent);
  const recipients = numbers.join(",");
  const text = encodeURIComponent(body);

  if (isIOS && numbers.length > 1) {
    const query = body ? `&body=${text}` : "";
    return `sms://open?addresses=${recipients}${query}`;
  }

  const query = body ? `?body=${text}` : "";
  return `sms:${recipients}${query}`;
}

smsHref(["+34600000001", "+34600000002"], "¿Entrenamos a las 8?");

Esta expresión regular solo detecta iPhone y iPod touch. Desde iPadOS 13, Safari en el iPad se identifica como Macintosh, igual que un Mac, así que ambos reciben el formato estándar aunque también abran la app Mensajes de Apple. Para distinguir un iPad de un Mac se suele combinar Macintosh con navigator.maxTouchPoints > 1.

Cuándo resulta útil

Aunque en España casi toda la mensajería personal pasa por WhatsApp o Telegram, el esquema sms: sigue resolviendo bien varios casos donde no quieres asumir qué aplicaciones tiene instaladas el usuario:

Fuentes


Comparte


Artículos relacionados

Fragmentos de texto en URLs: navegación exacta sin anclas

Los Fragmentos de Texto llevan la precisión de los enlaces web al siguiente nivel. Ya no necesitas IDs ni anclas (anchor) para dirigir a tus usuarios al contenido exacto de una página: resalta el texto clave y mejora la experiencia de navegación. Descubre cómo implementar esta técnica para crear enlaces más útiles y directos.

Leer artículo→

http://http://http://@http://http://?http://#http:// es una URL válida

Una URL formada por siete http:// seguidos que el navegador acepta como válida. Cómo la descompone new URL() y por qué no todos los parsers coinciden.

Leer artículo→