Tutorial: Comunicação entre WatchOS e iOS

Julio Brazil
Apple Developer Academy | Mackenzie
3 min readMay 2, 2018

Como fazer seu Watch app trocar informações com seu iOS app.

Para os fins deste tutorial, vamos assumir que o leitor já está familiarizado com desenvolvimento para iOS.

O Apple Watch tem como seu principal objetivo ampliar a experiência do App possibilitando que o desenvolvedor forneça ao usuário outro meio de interação, podendo assim criar uma experiência diferente, de uma maneira muito similar ao today widgets, porém, diretamente no pulso do usuário.

Para acompanhar o tutorial, clone o projeto base.

O Aplicativo que vamos desenvolver neste tutorial é extremamente adulto e maturo, vamos desenvolver um "dispositivo explosivo de flatulência", o Fart Bomb. Deixando a maturidade de lado, o aplicativo reproduz um som após uma breve contagem regressiva, que se inicia ao comando do Watch, por sua vez o aplicativo envia de volta o tempo restante para o som ser reproduzido.

Como transferir dados entre Apple Watch e iPhone?

A transferência de dados entre Apple Watch e iPhone expande a gama de ferramentas disponíveis ao desenvolvedor. Mas como fazer isso? E quais as restrições?

Para que haja meios desta transmissão ocorrer, é necessário que os dispositivos estabeleçam uma conexão, mas existem restrições:

  • Não são todos os iPhones que suportam conexão com o Watch;
  • O iPhone, ou o Watch podem estar unreacheable, ou "inalcançáveis";
  • O Watch App pode não estar instalado (no caso de enviar informações do iOS ao Watch).

Portando, antes de enviar um "Hello Watch!" para o Apple Watch é necessário verificar os cenários acima mencionados que afetariam o funcionamento normal do sistema. Devemos primeiramente importar o WatchConnectivity, e então estabelecer uma WCSession, caso ela seja suportada.

No arquivo ViewController.swift, que deve herdar de WCSessionDelegate (os métodos necessários serão implementados em breve), substitua o TODO no viewDidLoad() por este código:

Caso a WCSession seja suportada, obtém-se a sessão padrão, define-se o delegate da sessão como self e então a sessão pode ser ativada.

O mesmo deve ser feito dentro da função awake(withContext:) da InterfaceController.swift no watch.

Ainda na InterfaceController.swift, deve-se implementar o WCSessionDelegate, sobrescrevendo o método session(_:didReceiveMessage:)

O método session(_:activationDidCompleteWith:error:) não será utilizado.

Agora, se o projeto for executado, nada acontece ainda, pois quando o botão no watch é apertado, nenhuma informação é enviada, para que isso aconteça, a função startExplosion() deve conter o seguinte código:

Este código apenas envia a mensagem para o outro dispositivo da sessão, é possível fornecer funções de tratamento para resposta e erro.

ATENÇÃO: o método session(_:didReceiveMessage:replyHandler:) será chamado no outro dispositivo, ao invés de session(_:didReceiveMessage:) caso um replyHandler seja especificado no método acima descrito.

Voltando a ViewController.swift, devemos implementar também o método session(_:didReceiveMessage:), que deve ser similar a:

O app no iOS deve também enviar o tempo restante para a explosão, porém, somente se o watch estiver alcançavel. Deve-se modificar o método sendTimer(value:) para que ele contenha o código:

Caso o Watch esteja "alcançavel" define-se uma mensagem e a envia para o watch, sem a necessidade de resposta.

Rodando o Aplicativo, é possível testar o app, como dito antes, ele é extremamente maturo e adulto, como tal deve ser usado com moderação.

Caso queira comparar seu código com o projeto pronto, é possível obte-lo através deste link.

Conclusão

A comunicação entre os aplicativos para WatchOS e iOS é relativamente simples, ela consiste apenas em dois delegates, um para cada dispositivo, e uma série de métodos. O único problema é a dificuldade para debugar caso um problema apareça, pois no simulador é possível ver apenas o console de um dos dispositivos.

--

--