Tutorial: Comunicação entre WatchOS e iOS
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:
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:
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:
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.