让人闹心的WatchConnectivity

最近开发一款手表项目,需要手机手表通信。选择WatchConnectivity来实现功能。以前也没研究过,于是先来个demo学习一下。

最先让本同学上火(可能还没到闹心的地步)的,是使用模拟器运行代码,发现手机手表就不能通讯。手机发的消息,手表看不到,手表发的,手机也收不着。这就比较烦了,于是baidu、biying、google一串下来发现必须用真机调试。真机运行下,果然可以。

Demo可以了,结合自己的业务搞起,自定义了数据对象,传输自定义对象列表balabala……然后悲剧了。wcSession.sendMessage中message类型是[String : Any],不能传递自定义类型数据。
所以只能将查询的自定义对象列表转换成对应的数据格式进行发送。至此,勉强的把数据组装起来,传递到手表端,手表端也不负众望的能接收数据并且显示出来。可刚要绽放的笑容瞬间又消失啦啦啦,那个啥……字典是无序的,显示的内容每次都变着法的气人,原本可能有点上火,现在就是闹心啦。大神们别喷,毕竟学习语法时记得,实践的时候那么不巧的忘了。然后,换了种写法,愉快的搞定了。晚饭加了个鸡腿(裂开腮帮子那叫一个痛快,哈哈)

调试没啥问题愉快的封板。然后ios有版本更新,watch也有更新提示,更吧。没想到闹心的来了。“WCSession WCErrorCodeNotReachable”,去论坛一顿查阅,也没见个解决的,郁闷ing,想着是不是自己写的代码太差,这里是不是替换成单例,那里是不是要单独封装……各种改代码,然后过了好久郁闷了好久,又有版本更新啦,更完了,问题没了,用最初封板的代码,一点都没改过的版本,运行良好。

以为这样就结束了,那就too young了,哪里听说过ios不更新啦!!!后面又有各种更新,同学的代码也是今天可以运行,下个更新版本可能就不行,所以我决定彻底解决一下这个问题。顺便插一句,昨天打了第二针新冠疫苗,那叫一个困呀,就困成狗的情况下我还想是哪里的问题。我又搞了个demo,不加业务,纯测试。
1、尝试从手表给手机发message,不需要应答数据的那种,每次都成功。
代码如下:

//watch
let message = ["message":"hello phone"]
        wcSession.sendMessage(message, replyHandler: nil) { error in
            print(error.localizedDescription)
        }

//phone
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
       print("message:\(message)")
    }

2、尝试手表给手机发message,需要应答数据的那种,每次都失败。
代码如下:
```
//watch
let message = ["query": true]
wcSession.sendMessage(message) { reply in
let data = reply["data"] as! String

top Created with Sketch.