# La app de iOS, a fondo

Esta es la inmersión a fondo: cada pantalla de URnetwork en iPhone y iPad,
los ajustes con sus valores de fábrica y el conocimiento de resolución de
problemas que suele vivir en la cabeza de un ingeniero de soporte. Para el
camino de instalar a conectar, ver los
[primeros pasos en iOS](/docs/getting-started-ios); para el diseño de red
que hay detrás de todo, la [visión general](/docs/overview).

## Cómo está construida la app

Un solo proyecto de Xcode produce las apps de iOS y macOS. En tu dispositivo
se ejecuta como dos procesos:

- **La app** (bundle `network.ur`) es la interfaz que ves.
- **La extensión de túnel** (`network.ur.extension`) es una Network
  Extension (`NEPacketTunnelProvider`) que el propio iOS arranca y
  supervisa. Tu tráfico se mueve por este proceso, no por la app: envuelve
  en cifrado lo que tu teléfono envía (el "túnel") antes de que salga del
  dispositivo. Cuatro cosas quedan fuera por configuración, como en
  cualquier VPN de iOS bien educada: tu red local (impresoras, AirPlay,
  dispositivos del hogar), las notificaciones push de Apple, los servicios
  de operadora como las llamadas por Wi-Fi, y el tráfico hacia tus propios
  dispositivos Apple cercanos.

Los dos hablan por un RPC de dispositivo local, así que tras un rearranque
la app adopta el túnel vivo en lugar de tumbarlo y empezar de cero. Esta
división es la razón de que la VPN siga funcionando cuando deslizas la app
para cerrarla, y de que iOS te pida aprobar una configuración VPN la primera
vez: la extensión es un componente gestionado por el sistema. Esa aprobación
es el paso de consentimiento estándar de Apple para cualquier app de VPN. No
concede ningún otro control sobre tu teléfono, y queda visible, y revocable,
en Ajustes → General → VPN y gestión de dispositivos (Settings → General →
VPN & Device Management).

La app necesita iOS 16.6 o posterior, y todo es código abierto en
[github.com/urnetwork](https://github.com/urnetwork). Ninguna auditoría
independiente cubre el protocolo ni el código de servidor del operador,
donde viven las afirmaciones de privacidad. Dos evaluaciones de terceros de
2025 cubren otras superficies: una prueba de penetración de la aplicación
web y la API, y una evaluación MASA AL2 de Leviathan Security Group sobre la
app de Android, que la superó. Ninguna cubre la app de iOS. El
[modelo de amenazas](/docs/threat-model) registra ambas y sus límites.

## Las cuatro pestañas

La app son cuatro pestañas: **Conectar** (Connect), **Cuenta** (Account),
**Clasificación** (Leaderboard) y **Soporte** (Support).

### Conectar

La pantalla principal, de arriba abajo:

- **El globo.** Una imagen en vivo de tu sesión. Conectado, muestra las
  ubicaciones por las que sale tu tráfico: donde internet te ve. Tu cliente
  mantiene varios proveedores a la vez, normalmente de tres a ocho, en dos
  ventanas en paralelo (una ventana de calidad que HTTPS prefiere y una
  ventana de velocidad para el resto), y fija cada sitio a uno. La imagen es
  plural a propósito mientras cualquier sitio web concreto sigue viendo una
  sola dirección estable. La [visión general](/docs/overview) explica la
  ventana de proveedores al completo.
- **El botón de conectar.** Un toque para conectar o desconectar.
- **El panel.** Una hoja plegable bajo el botón que guarda tu ubicación
  seleccionada, las **Opciones de conexión** (Connect options), las
  gráficas de tráfico en vivo y el conmutador **Bloquear anuncios y
  rastreadores** (Block ads and trackers). Arrástrala hacia arriba para el
  contenido completo; tocar la pestaña Conectar cuando ya estás en ella
  vuelve a plegar el panel. Compartir conexión no está aquí. Vive en
  Cuenta → Ajustes.

Toca la tarjeta de ubicación para abrir la hoja **Proveedores disponibles**
(Available providers). Abre con tus propios dispositivos, "Mejor proveedor
disponible" (Best available provider) y países con un recuento en vivo de
proveedores en línea. Teclea el nombre de un lugar en "Buscar proveedores"
(Search providers) y los resultados ganan una sección de **Ciudades**
(Cities): buscar es como se llega a la puntería de nivel ciudad, no
desplazarse. Una ubicación se lista solo mientras el dispositivo de un
miembro está en línea en ella, y la plataforma deriva la ciudad de la
conexión que observa en lugar de fiarse de lo que el proveedor declare; una
dirección que parece un centro de datos o una VPN se degrada en lugar de
recibir confianza. "Mejor disponible" elige los proveedores mejor puntuados
cerca de ti; una ubicación concreta te hace aparecer allí (las salidas
cercanas suelen ser las más rápidas, porque la distancia cuesta latencia).
Los proveedores son otros miembros compartiendo ancho de banda sobrante. Tu
tráfico les llega ya cifrado, porque la web es HTTPS antes de entrar
siquiera en el túnel, así que un proveedor ve adónde va el tráfico que
transporta, como hace un ISP, pero no sus contenidos, y no tu dirección
real.

Más abajo en el panel están las cuatro **Opciones de conexión**:

| Ajuste | Valor por defecto | Efecto | Coste principal |
|---|---|---|---|
| Modo de conexión (Connection Mode) | Auto | Auto ejecuta ambas ventanas de proveedores y encamina cada paquete a la que corresponde | Web o Streaming se comprometen con una sola ventana |
| IP fija (Fixed IP) | Desactivado | Estrecha la ventana a un solo proveedor, así que todos los sitios ven una misma dirección estable | Renuncia a la salida plural |
| Anonimización fuerte (Strong Anonymization) | Activado | Prohíbe una ruta directa cliente-proveedor, así que el proveedor nunca ve tu IP real | Más lento que la ruta directa |
| Cifrado poscuántico (Post Quantum Encryption) | Activado | Sella la sesión de extremo a extremo hasta el proveedor, así que el operador transporta texto cifrado | Omite los proveedores con los que no puede sellar |

- IP fija es seleccionable fuera de Auto.
- Desactivar Anonimización fuerte es como se opta al modo directo: el salto
  anonimizador desaparece, tu cliente habla directamente con el proveedor,
  el rendimiento sube y ese proveedor pasa a ver tu dirección real. El valor
  por defecto protege tu identidad; gástala por velocidad solo si es lo que
  quieres.
- **Bloquear anuncios y rastreadores**, en el mismo panel, está desactivado
  hasta que lo enciendas y filtra todo lo que transporta el túnel.
- Entre los dos valores por defecto activados, un proveedor nunca sabe quién
  eres y el operador nunca lee lo que envías. Ambas cosas se cumplen sin
  tocar un ajuste, así que ninguna parte por sí sola reúne tu identidad y tu
  actividad.

Esos dos conmutadores y el valor de fábrica son el cuadro completo:

| Modo | El operador ve | El proveedor ve | Valor por defecto y disponibilidad |
|---|---|---|---|
| **Retransmitido sellado** | tu cuenta y conexión de origen, en qué proveedores estás, y texto cifrado con su tiempo y volumen | los destinos que saca a internet y un id de dispositivo/contrato, **no** tu IP real | el valor de fábrica: Cifrado poscuántico, activado en el panel de conexión |
| **Retransmitido estándar** | tu cuenta y conexión de origen, en qué proveedores estás, y los destinos y bytes de paquete del interior | los destinos que saca a internet y un id de dispositivo/contrato, **no** tu IP real | opcional: desactiva **Cifrado poscuántico** |
| **Directo** | menos intervención en la retransmisión | **tu IP real** y los destinos que saca a internet | opcional: desactiva **Anonimización fuerte** |

Lee la primera fila como el lugar donde estás por defecto. Mientras Cifrado
poscuántico está activado, el cliente opera con fallo cerrado: un proveedor
con el que no puede sellar una sesión se omite, no se usa en claro, así que
lo que cuesta un desajuste es ese proveedor, no tu confidencialidad.
Desactivar el ajuste es lo que te pone en la segunda fila. Ninguna app
muestra todavía un veredicto de sellado-o-no por conexión, así que lo que te
dice dónde estás es el ajuste, no la sesión. Límite: nada verifica que los
proveedores que se te ofrecen sean independientes entre sí o del operador, y
el operador puede ejecutar proveedores él mismo. El
[modelo de amenazas](/docs/threat-model) trabaja estas filas frente a
adversarios con nombre, incluido un operador hostil, y es explícito sobre
dónde falla cada una.

### DNS personalizado

Bajo los detalles de la pestaña Conectar vive un panel de control de DNS
completo. El DNS es la guía telefónica de internet, la consulta que
convierte un nombre como ur.io en una dirección de red, y quien responde
esas consultas (el resolvedor) ve el nombre de cada sitio que visitas. El
valor por defecto es la disposición más segura: DNS cifrado sobre HTTPS,
resuelto a través del túnel. Todo lo demás es un intercambio que puedes
hacer:

- **DNS sobre HTTPS (remoto).** DoH resuelto al otro lado del túnel. El
  valor por defecto, y el más privado: el resolvedor ve la dirección de un
  proveedor, no la tuya.
- **DNS sobre HTTPS (local).** DoH resuelto directamente desde tu
  dispositivo.
- **DNS sin cifrar (remoto / local).** DNS UDP clásico, por el túnel o
  directo desde el dispositivo, para redes y resolvedores que lo necesiten.
- **Respaldo de DNS local (Local DNS fallback).** Hace competir a un
  resolvedor local mientras el túnel arranca, para que las consultas de
  nombres no se atasquen durante el handshake. Desactivado, el DNS solo se
  resuelve a través del túnel.

Puedes editar tú mismo las listas de resolvedores (URLs de DoH remotas y
locales, servidores DNS remotos y locales, IPv4 e IPv6). Dos comodidades
encima:

- **Recomendaciones por país.** Se sabe que los ajustes más fuertes no
  funcionan en algunos países. Cuando te conectas a un lugar con una
  recomendación conocida, la pantalla lo dice y ofrece un "Usar ajustes
  recomendados" (Use recommended settings) de un toque, y una restauración
  de un toque de vuelta a los valores más seguros.
- **Servidores sugeridos.** Una lista curada de servidores DNS remotos, con
  los sugeridos para tu país conectado marcados en su color. Activar uno lo
  añade a tu lista de resolvedores remotos.

### Reglas de división

Las reglas de división te dejan encaminar tráfico concreto fuera del túnel o
fijarlo en su sitio, a nivel de dominio e IP:

- Conectado, la pantalla muestra la actividad de enrutamiento en vivo. Toca
  un dominio para encaminarlo en local (esquivando el túnel, con lo que ese
  sitio pasa a ver tu dirección real), o mantenlo en un solo proveedor para
  que ese sitio vea una dirección estable durante más tiempo en lugar de tu
  salida plural habitual. Útil para bancos e inicios de sesión que desafían
  cualquier cambio de dirección.
- Las reglas se aplican a todo el grupo de red coasociado alrededor de un
  dominio, así que los hosts relacionados y el tráfico de CDN caen juntos en
  lugar de escaparse un subdominio cada vez.
- Las reglas persisten y pueden quitarse en cualquier momento desde la misma
  pantalla.

Límite: **el túnel dividido por aplicación no está disponible en iOS**
(Android y Windows lo tienen). iOS no da a las apps de VPN una vía soportada
para incluir o excluir tráfico por app, así que en iPhone y iPad las reglas
de división operan sobre dominios e IPs, no sobre apps.

### Compartir conexión

Compartir tu ancho de banda sobrante es un selector de cuatro posiciones
**Compartir conexión** (Provide mode) en Cuenta → Ajustes → Conexiones
(Account → Settings → Connections), fijado en **Nunca** (Never) hasta que lo
cambies:

| Modo | Qué transporta |
|---|---|
| **Nunca (Never)** | Nada. El valor por defecto. |
| **Auto** | Tráfico público mientras tú estás conectado; solo tus propios dispositivos cuando no |
| **Siempre (Always)** | Tráfico público, conectado o no |
| **Red (Network)** | Solo los dispositivos de tu propia red, sin pago. El compartir más estrecho que implementa la app |

Algunas reglas básicas. Compartir usa solo Wi-Fi salvo que actives
**Permitir compartir en red móvil** (Allow providing on cellular network) en
la misma sección, así que nunca toca tu plan de datos por sorpresa. Corre
dentro del proceso del túnel, así que sigue funcionando mientras el teléfono
está inactivo. El tráfico que transportas son sesiones cifradas de otras
personas: no puedes leerlo, y no puede tocar tu dispositivo. La aplicación
de las normas contra el abuso corre en tu dispositivo en la salida, donde el
tráfico parte hacia internet: BitTorrent y los patrones de ataque conocidos
se descartan allí. El descarte no registra nada, ni destino, ni dominio, ni
contenidos, aunque una coincidencia de BitTorrent en claro envía además al
operador una señal que lleva el id de dispositivo y un booleano, nada más.
El tráfico público que transportas se mide bajo contratos firmados, y los
proveedores participan en el protocolo UR. [ur.xyz](https://ur.xyz)
documenta cómo funcionan las recompensas.

### Cuenta

Tu identidad y tu plan viven aquí:

- **Plan.** Gratuito o Pro, el saldo que te queda, la vía de mejora
  (Upgrade) y un total acumulado de lo que tu conexión ha transportado para
  la red.
- **Canjear código de saldo (Redeem Balance Code).** Una concesión de datos
  de un solo uso, sin suscripción.
- **Perfil (Profile)**, **Ajustes (Settings)**, **Cartera (Wallet)**.
  Ajustes es el profundo: frase de recuperación, métodos de inicio de
  sesión, nombre del dispositivo, Conexiones (compartir conexión, el
  permiso de datos móviles, el kill switch (interruptor de corte),
  **Ubicaciones bloqueadas** (Blocked locations): países por los que nunca
  quieres salir), notificaciones, eliminación de la cuenta y un enlace "Usa
  el protocolo UR" (Uses the UR Protocol) a [ur.xyz](https://ur.xyz) sobre
  cómo se recompensa a los proveedores.
- **Comprobar mi IP (Check my IP).** Abre [ur.io/ip](https://ur.io/ip), la
  forma de confirmar desde fuera de la app que tu tráfico de verdad está
  saliendo por otro lugar.
- **Identidad poscuántica (Post Quantum Identity).** El panel de abajo, y la
  vía a las identidades de los proveedores a los que estás conectado.

### El panel de identidad poscuántica

El panel al final de Cuenta muestra la identidad de tu dispositivo como un
identicon (una imagen derivada de la clave, más fácil de comparar a ojo que
el hexadecimal) con su hash de clave y su id de cliente debajo, cada uno
copiable con un toque, una hoja de compartir y una baraja de los pares a los
que estás conectado que abre la lista completa. Declara su propio propósito:
si la clave de un par alguna vez se ve distinta de la almacenada en local,
no se puede confiar en el operador de en medio. Esto hace comprobable la
ceguera del operador.

El cifrado que nombra es el conmutador **Cifrado poscuántico** del panel de
conexión, activado por defecto, así que tu cliente sella el tráfico
directamente hasta el proveedor desde la primera conexión. La sesión es TLS
1.3 mutuamente autenticado con claves de **X25519MLKEM768** (una curva
clásica hibridada con el ML-KEM del NIST), de modo que el operador
retransmite bytes que no puede leer. El lado que responde es oportunista:
toda compilación actual de proveedor lo habilita, así que un mismo proveedor
puede atender por igual a clientes sellados y sin sellar. Tu lado no lo es.
Mientras el conmutador está activado el cliente opera con fallo cerrado, y
un proveedor con el que no puede sellar una sesión se omite en lugar de
usarse en claro. Ninguna app muestra todavía un veredicto de sellado-o-no
por conexión. Las identidades siguen siendo Ed25519.

### Clasificación

Rankings de los mayores proveedores por datos movidos. Si compartes, puedes
aparecer aquí, en público o en privado, a tu elección.

### Soporte

Titulada "Ponte en contacto" (Get in touch): una caja de comentarios, una
valoración con estrellas, un conmutador opcional **Adjuntar logs al
comentario** (Attach logs to feedback) y una invitación a Discord para ayuda
en vivo. Los planes no están aquí; la mejora vive en la pestaña Cuenta.

## Siri y Atajos

La app registra dos App Intents: **Conectar URnetwork VPN** (Connect
URnetwork VPN) y **Desconectar URnetwork VPN** (Disconnect URnetwork VPN).
Aparecen en la app Atajos (Shortcuts), funcionan por voz ("Oye Siri,
conecta URnetwork") y se encadenan en automatizaciones, como conectar al
salir de la Wi-Fi de casa.

## Empezar sin correo, y la frase que lo conserva

**Crear Cuenta instantánea** (Create Instant Account) en la pantalla de
inicio de sesión te da una red real y permanente en un toque. Sin correo,
sin teléfono, sin contraseña, como dice la propia pantalla. Lo que la
asegura en su lugar es una **frase de recuperación** (seedphrase): una lista
de palabras que la plataforma genera y te muestra exactamente una vez, en la
pantalla justo después de la creación, conservando después solo formas hash
de ella. Guárdala en ese momento. Es la única forma de volver a entrar desde
un dispositivo que no tenga ya la sesión iniciada. Mientras aún tengas uno
que la tenga, Ajustes → Frase de recuperación (Settings → Seedphrase) acuña
una frase nueva y retira la antigua. Con ella guardada, la cuenta sobrevive
a una reinstalación o a un iPhone nuevo, con plan e historial intactos, cosa
que una identidad local del dispositivo nunca hace. Nada de esto es de
segunda clase: Ajustes → Métodos de inicio de sesión (Settings → Sign-In
Methods) añade un correo, un teléfono, un inicio de sesión con Apple o
Google, o una cartera a la misma red, conservando tu saldo de datos y tu
historial. El anonimato está en la cuenta, no en el pago: una suscripción
comprada en la app queda ligada a tu cuenta de Apple; un código de saldo, a
nadie.

## Resolución de problemas

### La aprobación de la configuración VPN

La primera conexión pide añadir una configuración VPN. Si la rechazaste, el
túnel no puede arrancar jamás. Apruébala en el siguiente intento de
conexión, o revisa Ajustes → General → VPN y gestión de dispositivos, donde
la configuración de URnetwork debería estar listada.

### Varios perfiles de VPN, y cómo los gestiona la app

iOS puede acumular más de un perfil de VPN de URnetwork a lo largo de
reinstalaciones y actualizaciones. La app cuenta con ello: al conectar
enumera todos los perfiles, restablece y reintenta cualquiera que no
arranque, y pasa al siguiente. Si un túnel ya está en marcha, lo adopta por
el RPC de dispositivo en lugar de reiniciarlo. Los perfiles rotos se
restablecen o eliminan, con un tope de eliminaciones para que la limpieza
nunca se desboque, y toda operación sobre perfiles está acotada por plazos
para que un demonio del sistema atascado no pueda colgar la app. Todo es
automático. Se describe aquí solo para que la lista de perfiles de Ajustes
tenga sentido cuando la mires.

### "Failed to load VPN profiles" (error 12)

Si conectar falla con **"Failed to load VPN profiles"** (código de error
12), el almacén de preferencias de VPN del sistema se niega a enumerar
perfiles, un estado que la app no puede reparar desde dentro. Arréglalo a
mano:

1. Abre Ajustes → General → VPN y gestión de dispositivos.
2. Elimina la(s) configuración(es) VPN de URnetwork.
3. Vuelve a la app y conecta. Se te pedirá aprobar una configuración nueva,
   y el túnel arranca limpio.

### Cómo funciona aquí el kill switch

La app lleva un conmutador **Kill switch** en Cuenta → Ajustes → Conexiones,
el mismo control del SDK que tiene toda app de URnetwork, desactivado hasta
que lo enciendas. Activado, el cliente se niega a recurrir a tu ruta local,
así que el tráfico se detiene en lugar de fugarse fuera del túnel. Lo que
iOS no le da es aplicación a nivel de sistema operativo. La app no establece
`includeAllNetworks`, así que si el proceso del túnel muere de forma
inesperada, iOS restaura la red normal en lugar de bloquear el tráfico. La
supervisión, los reintentos y la recuperación de perfiles mantienen sano el
túnel, pero la app no le pide al sistema un fallo cerrado garantizado. Si tu
modelo de amenazas exige una red con fallo cerrado garantizado, cuenta con
ello.

### Leer los logs del túnel

La extensión del túnel escribe en el log unificado del sistema, no en
archivos. Para verlo:

1. Conecta el dispositivo a un Mac y abre **Console.app**.
2. Selecciona el dispositivo, y en el menú Acción activa **Incluir mensajes
   de información** (Include Info Messages) e **Incluir mensajes de
   depuración** (Include Debug Messages). Las líneas interesantes están en
   esos niveles.
3. Filtra por el subsistema `network.ur.extension` o busca "URnetwork".

### Reposo y comportamiento en segundo plano

El túnel está configurado con `disconnectOnSleep` desactivado: la VPN se
mantiene a través del reposo del dispositivo en lugar de rehacer el
handshake cada vez que la pantalla se bloquea. Con el diseño de dos procesos
también sobrevive a que deslices la app para cerrarla. Desconectar es algo
que haces con el botón, con Siri o quitando el perfil.

## Adónde ir ahora

- [Primeros pasos en iOS](/docs/getting-started-ios) para el camino corto.
- [El recorrido de macOS](/docs/tour-macos) para el mismo motor, con forma
  de Mac.
- Las [preguntas frecuentes](/docs/faq) y la
  [visión general](/docs/overview) para la red en sí.
