Companion App — una aplicación compañera para dispositivos wearables Apple Watch y Wear OS, que funciona junto con la aplicación principal en el teléfono inteligente. Companion App sincroniza datos a través de WatchConnectivity (iOS) o Wearable Data Layer (Android), muestra notificaciones en el reloj y puede funcionar de forma autónoma. El desarrollo se realiza en Swift para watchOS y Kotlin para Wear OS. Más información en WatchConnectivity Docs.
Lo más importante
Companion App — una aplicación para dispositivos wearables Apple Watch o Wear OS que se distribuye junto con la aplicación principal de iOS o Android. El objetivo principal es ampliar la funcionalidad a la muñeca: visualización rápida de información, respuesta a mensajes, control de música, seguimiento de entrenamientos. Companion App se instala automáticamente en el reloj al instalar la aplicación principal en el teléfono, si el desarrollador la incluyó en la compilación.
Arquitectura de una aplicación companion incluye dos componentes: la aplicación iOS/Android (principal) y la aplicación watchOS/Wear OS (compañera). La comunicación entre ellas se realiza a través de las API del sistema: WatchConnectivity para Apple y Wearable Data Layer para Google. Los datos se transfieren en segundo plano por Bluetooth o Wi-Fi — el usuario no ve el proceso de sincronización. La aplicación en el reloj puede tener su propia interfaz de usuario, diferente a la del móvil, adaptada a una pantalla pequeña.
Tipos de aplicaciones companion se diferencian por su grado de dependencia del teléfono. Mirroring apps muestran una copia de los datos del teléfono y no funcionan sin conexión. Decoupled apps tienen su propia lógica, almacenan datos en caché y conservan parte de la funcionalidad al desconectarse del teléfono. Independent apps (watchOS 6+ y Wear OS 3+) se pueden instalar sin teléfono y funcionar de forma totalmente autónoma con su propio acceso a la red.
WatchConnectivity — el framework de Apple para la comunicación bidireccional entre iPhone y Apple Watch. Proporciona cuatro mecanismos de transferencia de datos: Application Context (último estado conocido), File Transfer (archivos de cualquier tamaño), User Info (diccionarios con entrega garantizada) e Interactive Messaging (comunicación bidireccional en tiempo real). El sistema elige automáticamente Bluetooth o Wi-Fi según la distancia y la calidad de la señal.
import WatchConnectivity
class PhoneSessionManager: NSObject, WCSessionDelegate {
func activateSession() {
WCSession.default.delegate = self
WCSession.default.activate()
}
func sendWorkoutData(_ data: WorkoutData) {
let dict = ["heartRate": data.heartRate,
"calories": data.calories] as [String: Any]
WCSession.default.transferUserInfo(dict)
}
func session(_: WCSession,
didReceiveUserInfo: [String: Any]) {
DispatchQueue.main.async {
NotificationCenter.default.post(
name: .workoutDataReceived,
object: didReceiveUserInfo)
}
}
}
Interactive Messaging — el único mecanismo de WatchConnectivity con entrega garantizada en tiempo real. Un mensaje se envía y recibe una respuesta en 200–500 ms cuando la conexión está activa. Se utiliza para acciones que requieren una respuesta inmediata: iniciar un entrenamiento, confirmar un pago, abrir una puerta de casa inteligente. La sesión debe estar activa en ambos dispositivos — si el reloj está bloqueado o la aplicación está en segundo plano, no se garantiza la entrega.
File Transfer API está diseñado para grandes volúmenes de datos: imágenes, archivos de audio, entrenamientos exportados. Los archivos se transfieren en segundo plano incluso cuando la aplicación está cerrada. El límite es de hasta 10 transferencias simultáneas en cola. Application Context es el mecanismo más económico: transmite solo el último estado, cancelando contextos anteriores no enviados. Es ideal para sincronizar configuraciones y estado actual.
Wearable Data Layer — una API de Google Play Services para sincronizar datos entre un dispositivo Android y relojes Wear OS. Proporciona tres protocolos: DataItem (sincronización de pares clave-valor), MessageClient (mensajes unidireccionales) y ChannelClient (transmisión de datos en streaming). Los DataItems se sincronizan automáticamente a través de Google Cloud — si el teléfono no está disponible, los datos se entregan cuando se restablece la conexión.
class WearableSyncService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
dataEvents.forEach { event ->
when (event.type) {
DataEvent.TYPE_CHANGED -> {
val uri = event.dataItem.uri
val path = uri.path // /workout/heartrate
val data = DataMapItem
.fromDataItem(event.dataItem)
.dataMap
val bpm = data.getInt("bpm")
updateUI(bpm)
}
}
}
}
}
MessageClient — envía mensajes unidireccionales con una ruta y un array de bytes. Se utiliza para comandos como "Iniciar entrenamiento" o "Pausar música". El mensaje se entrega de forma fiable si el dispositivo está conectado. Para recibir mensajes en Wear OS, implemente WearableListenerService y regístrelo en el manifiesto. MessageClient no admite el almacenamiento en caché automático — si el reloj está desconectado, el mensaje se pierde.
ChannelClient — un protocolo para datos en streaming: audio, video, flujos continuos de sensores. Abre un canal bidireccional a través del cual se transmiten arrays de bytes. Solo es compatible con Wear OS 2.0+. ChannelClient es útil para transmitir audio del teléfono al reloj para llamadas a través de Bluetooth y para retransmitir datos de sensores Bluetooth externos (monitor de frecuencia cardíaca, ciclocomputador) a través del teléfono al reloj.
Funcionamiento autónomo — la capacidad de una aplicación companion de funcionar sin conexión al teléfono. En watchOS con módulo Cellular, la aplicación envía solicitudes de red directamente a través de eSIM. En Wear OS con LTE, hay una funcionalidad similar disponible. Incluso sin módulo celular, el reloj almacena en caché los últimos datos del teléfono y los muestra cuando está desconectado — el usuario ve la información que estaba actualizada en el momento de la última sincronización.
| Modo | Datos | Disponibilidad | Ejemplo |
|---|---|---|---|
| En línea | En vivo del servidor/teléfono | Completa | Ruta de navegación |
| En caché | Últimos del teléfono | Limitada | Lista de contactos |
| Sin conexión | Locales en el reloj | Mínima | Temporizador, cronómetro |
Almacenamiento en caché — un elemento clave del funcionamiento autónomo. La aplicación debe guardar el último estado recibido en el almacenamiento local del reloj. En watchOS se usa UserDefaults o CoreData, en Wear OS — Room Database o DataStore. Al restablecerse la conexión, la caché se actualiza mediante sincronización en segundo plano. Si los datos tienen más de 24 horas, la aplicación muestra un mensaje "Actualice la conexión con el teléfono".
Interfaz de usuario wearable para pantalla limitada — el reloj tiene una pantalla de 1.5–2 pulgadas — la interfaz de la aplicación companion debe ser lo más concisa posible. Apple recomienda NavigationView con una sola columna en watchOS, Google recomienda una lista de tarjetas en Wear OS con deslizamiento para navegar. Los botones deben tener al menos 44pt para un toque cómodo. Evite los campos de entrada de texto — use respuestas predefinidas, dictado o la rueda de desplazamiento Digital Crown.
Diseño energéticamente eficiente — la aplicación companion no debe agotar la batería del reloj en pocas horas. Utilice actualizaciones en segundo plano con un intervalo mínimo. En watchOS, WatchConnectivity pausa las transferencias cuando la batería está baja y las reanuda después de la carga. En Wear OS, Wearable Data Layer agrupa automáticamente las transferencias pequeñas en una para ahorrar energía. Wrist raise — actualice la interfaz de usuario solo cuando el usuario levante la muñeca.
Arquitectura de la aplicación companion debe diseñarse teniendo en cuenta la posible pérdida de conexión. Utilice el patrón Repository: una única fuente de datos en el teléfono se sincroniza con el repositorio local en el reloj. El ViewModel en el reloj se suscribe al repositorio local y muestra los datos independientemente del estado de la conexión. Cuando se restablece la conexión, el Repository en el reloj solicita datos a través de WatchConnectivity o Wearable Data Layer y actualiza el almacenamiento local.
class WorkoutRepository constructor(
private val localStorage: WorkoutDao,
private val wearableClient: WearableClient
) {
val workoutFlow: Flow<Workout?> = merge(
localStorage.observeWorkout(),
wearableClient.observeWorkout()
.onEach { localStorage.save(it) }
)
}
Pruebas de una aplicación companion requieren verificación en relojes reales o un emulador. Xcode admite el simulador de Apple Watch junto con el simulador de iPhone — puede probar WatchConnectivity sin dispositivos físicos. Android Studio incluye un emulador de Wear OS con soporte para Wearable Data Layer. Casos de prueba críticos: pérdida de conexión durante la transferencia, batería baja, funcionamiento simultáneo de dos aplicaciones companion e instalación sin teléfono en relojes independientes.
Publicación de una aplicación companion en watchOS no requiere una carga separada en App Store — la aplicación se incluye en el binario de la aplicación iOS y se ofrece automáticamente para su instalación en el reloj. En Wear OS, la aplicación companion se publica por separado en Google Play, pero está vinculada a la aplicación principal a través del mismo paquete. App Group en iOS y sharedUserId en Android permiten que las aplicaciones principal y companion utilicen almacenamiento de datos compartido.
Preguntas frecuentes
Companion App requiere tener instalada la aplicación principal en iPhone o Android para su funcionalidad completa. Una aplicación independiente común en el reloj (por ejemplo, brújula o cronómetro) funciona de forma autónoma sin teléfono. Companion App sincroniza datos con el teléfono, muestra notificaciones y permite realizar acciones rápidas, pero sin el teléfono pierde algunas funciones.
WatchConnectivity admite cuatro modos: Application Context para transmitir el estado actual cancelando el anterior, File Transfer para archivos de cualquier tamaño, User Info para diccionarios de datos con entrega garantizada e Interactive Messaging para comunicación bidireccional en tiempo real. Los datos se transmiten por Bluetooth o Wi-Fi — el sistema selecciona automáticamente el canal óptimo.
Sí, una aplicación companion funciona de forma autónoma — watchOS y Wear OS almacenan en caché los datos recibidos del teléfono. En relojes con módulo celular, la aplicación envía solicitudes directamente a través de eSIM o LTE. Los datos en caché se muestran incluso sin conexión. Cuando se restablece la conexión, la caché se actualiza mediante sincronización en segundo plano.
Las categorías más populares: rastreadores de fitness con sincronización de entrenamientos, mensajeros para responder mensajes desde el reloj, navegadores con indicaciones de giro en la muñeca, reproductores de música para controlar la reproducción, sistemas de pago, hogar inteligente para controlar dispositivos y monitores médicos para pulso y presión arterial.
Apple Watch proporciona hasta 18 horas de funcionamiento con una aplicación companion activa en condiciones de uso estándar. Wear OS — hasta 24 horas. WatchConnectivity está optimizado para bajo consumo energético: la transferencia de datos se detiene cuando la batería está baja y la sincronización masiva se realiza durante la carga del reloj.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también