Companion App — um aplicativo companheiro para dispositivos vestíveis Apple Watch e Wear OS, que funciona em conjunto com o aplicativo principal no smartphone. O Companion App sincroniza dados via WatchConnectivity (iOS) ou Wearable Data Layer (Android), exibe notificações no relógio e pode funcionar de forma autônoma. O desenvolvimento é feito em Swift para watchOS e Kotlin para Wear OS. Saiba mais em WatchConnectivity Docs.
Principais pontos
Companion App — um aplicativo para dispositivos vestíveis Apple Watch ou Wear OS que acompanha o aplicativo principal iOS ou Android. O objetivo principal é estender a funcionalidade ao pulso: visualização rápida de informações, resposta a mensagens, controle de música, acompanhamento de treinos. O Companion App é instalado automaticamente no relógio ao instalar o aplicativo principal no telefone, se o desenvolvedor o incluiu na compilação.
Arquitetura de um aplicativo companion inclui dois componentes: o aplicativo iOS/Android (principal) e o aplicativo watchOS/Wear OS (companheiro). A comunicação entre eles é feita através de APIs do sistema: WatchConnectivity para Apple e Wearable Data Layer para Google. Os dados são transferidos em segundo plano via Bluetooth ou Wi-Fi — o usuário não vê o processo de sincronização. O aplicativo no relógio pode ter sua própria interface, diferente da do celular, adaptada para uma tela pequena.
Tipos de aplicativos companion diferem pelo grau de dependência do telefone. Mirroring apps exibem uma cópia dos dados do telefone e não funcionam sem conexão. Decoupled apps têm sua própria lógica, armazenam dados em cache e mantêm parte da funcionalidade quando desconectados do telefone. Independent apps (watchOS 6+ e Wear OS 3+) podem ser instalados sem telefone e funcionar de forma totalmente autônoma com seu próprio acesso à rede.
WatchConnectivity — o framework da Apple para comunicação bidirecional entre iPhone e Apple Watch. Ele fornece quatro mecanismos de transferência de dados: Application Context (último estado conhecido), File Transfer (arquivos de qualquer tamanho), User Info (dicionários com entrega garantida) e Interactive Messaging (comunicação bidirecional em tempo real). O sistema escolhe automaticamente Bluetooth ou Wi-Fi com base na distância e qualidade do sinal.
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 — o único mecanismo do WatchConnectivity com entrega garantida em tempo real. Uma mensagem é enviada e recebe resposta em 200–500 ms quando a conexão está ativa. É usado para ações que exigem resposta imediata: iniciar um treino, confirmar um pagamento, abrir uma porta de casa inteligente. A sessão deve estar ativa em ambos os dispositivos — se o relógio estiver bloqueado ou o aplicativo em segundo plano, a entrega não é garantida.
File Transfer API é projetado para grandes volumes de dados — imagens, arquivos de áudio, treinos exportados. Os arquivos são transferidos em segundo plano mesmo com o aplicativo fechado. O limite é de até 10 transferências simultâneas na fila. Application Context é o mecanismo mais econômico: transmite apenas o último estado, cancelando contextos anteriores não enviados. É ideal para sincronizar configurações e status atual.
Wearable Data Layer — uma API do Google Play Services para sincronizar dados entre um dispositivo Android e relógios Wear OS. Ele fornece três protocolos: DataItem (sincronização de pares chave-valor), MessageClient (mensagens unidirecionais) e ChannelClient (transmissão de dados em streaming). Os DataItems são sincronizados automaticamente via Google Cloud — se o telefone estiver indisponível, os dados são entregues quando a conexão é restaurada.
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 — envia mensagens unidirecionais com um caminho e array de bytes. É usado para comandos como "Iniciar treino" ou "Pausar música". A mensagem é entregue de forma confiável se o dispositivo estiver conectado. Para receber mensagens no Wear OS, implemente WearableListenerService e registre-o no manifesto. O MessageClient não suporta cache automático — se o relógio estiver desconectado, a mensagem é perdida.
ChannelClient — um protocolo para dados em streaming: áudio, vídeo, fluxos contínuos de sensores. Abre um canal bidirecional através do qual arrays de bytes são transmitidos. É suportado apenas no Wear OS 2.0+. O ChannelClient é útil para transmitir áudio do telefone para o relógio para chamadas via Bluetooth e para retransmitir dados de sensores Bluetooth externos (monitor de frequência cardíaca, ciclocomputador) através do telefone para o relógio.
Operação autônoma — a capacidade de um aplicativo companion funcionar sem conexão com o telefone. No watchOS com módulo Cellular, o aplicativo envia solicitações de rede diretamente via eSIM. No Wear OS com LTE, funcionalidade similar está disponível. Mesmo sem módulo celular, o relógio armazena em cache os dados mais recentes do telefone e os exibe quando desconectado — o usuário vê as informações que estavam atualizadas no momento da última sincronização.
| Modo | Dados | Disponibilidade | Exemplo |
|---|---|---|---|
| Online | Ao vivo do servidor/telefone | Completa | Rota de navegação |
| Em cache | Últimos do telefone | Limitada | Lista de contatos |
| Offline | Locais no relógio | Mínima | Temporizador, cronômetro |
Armazenamento em cache — um elemento chave da operação autônoma. O aplicativo deve salvar o último estado recebido no armazenamento local do relógio. No watchOS, usa-se UserDefaults ou CoreData; no Wear OS — Room Database ou DataStore. Quando a conexão é restaurada, o cache é atualizado por sincronização em segundo plano. Se os dados tiverem mais de 24 horas, o aplicativo mostra uma mensagem "Atualize a conexão com o telefone".
Interface wearable para tela limitada — o relógio tem uma tela de 1,5–2 polegadas — a interface do aplicativo companion deve ser a mais concisa possível. A Apple recomenda NavigationView com uma coluna no watchOS, o Google recomenda uma lista de cartões no Wear OS com deslize para navegação. Os botões devem ter pelo menos 44pt para toque confortável. Evite campos de entrada de texto — use respostas predefinidas, ditado ou a roda de rolagem Digital Crown.
Design energeticamente eficiente — o aplicativo companion não deve drenar a bateria do relógio em poucas horas. Use atualizações em segundo plano com intervalo mínimo. No watchOS, o WatchConnectivity pausa as transferências quando a bateria está baixa e as retoma após o carregamento. No Wear OS, o Wearable Data Layer agrupa automaticamente pequenas transferências em uma para economizar energia. Wrist raise — atualize a interface apenas quando o usuário levantar o pulso.
Arquitetura do aplicativo companion deve ser projetada considerando a possível perda de conexão. Use o padrão Repository: uma única fonte de dados no telefone sincroniza com o repositório local no relógio. O ViewModel no relógio assina o repositório local e exibe dados independentemente do estado da conexão. Quando a conexão é restaurada, o Repository no relógio solicita dados via WatchConnectivity ou Wearable Data Layer e atualiza o armazenamento 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) }
)
}
Testes de um aplicativo companion requerem verificação em relógios reais ou emulador. O Xcode suporta o simulador Apple Watch emparelhado com o simulador iPhone — você pode testar o WatchConnectivity sem dispositivos físicos. O Android Studio inclui um emulador Wear OS com suporte para Wearable Data Layer. Casos de teste críticos: perda de conexão durante transferência, bateria baixa, operação simultânea de dois aplicativos companion e instalação sem telefone em relógios independentes.
Publicação de um aplicativo companion no watchOS não requer envio separado para a App Store — o aplicativo está incluído no binário do aplicativo iOS e é automaticamente oferecido para instalação no relógio. No Wear OS, o aplicativo companion é publicado separadamente no Google Play, mas está vinculado ao aplicativo principal através do mesmo pacote. App Group no iOS e sharedUserId no Android permitem que os aplicativos principal e companion usem armazenamento de dados compartilhado.
Perguntas frequentes
O Companion App exige o aplicativo principal instalado no iPhone ou Android para funcionalidade completa. Um aplicativo independente comum no relógio (por exemplo, bússola ou cronômetro) funciona autonomamente sem telefone. O Companion App sincroniza dados com o telefone, exibe notificações e permite ações rápidas, mas sem o telefone perde algumas funções.
O WatchConnectivity suporta quatro modos: Application Context para transmitir o estado atual cancelando o anterior, File Transfer para arquivos de qualquer tamanho, User Info para dicionários de dados com entrega garantida e Interactive Messaging para comunicação bidirecional em tempo real. Os dados são transmitidos via Bluetooth ou Wi-Fi — o sistema seleciona automaticamente o canal ideal.
Sim, um aplicativo companion funciona autonomamente — watchOS e Wear OS armazenam em cache os dados recebidos do telefone. Em relógios com módulo celular, o aplicativo envia solicitações diretamente via eSIM ou LTE. Os dados em cache são exibidos mesmo sem conexão. Quando a conexão é restaurada, o cache é atualizado por sincronização em segundo plano.
As categorias mais populares: rastreadores de fitness com sincronização de treinos, mensageiros para responder mensagens do relógio, navegadores com instruções de direção no pulso, players de música para controle de reprodução, sistemas de pagamento, casa inteligente para controle de dispositivos e monitores médicos para pulso e pressão arterial.
O Apple Watch oferece até 18 horas de funcionamento com um aplicativo companion ativo em uso padrão. Wear OS — até 24 horas. O WatchConnectivity é otimizado para baixo consumo de energia: a transferência de dados é pausada quando a bateria está baixa e a sincronização em massa é realizada durante o carregamento do relógio.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também