让人闹心的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) { errorin
print(error.localizedDescription)
}
//phone
funcsession(_session:WCSession, didReceiveMessage message: [String:Any]) {
print("message:\(message)")
}
2、尝试手表给手机发message,需要应答数据的那种,每次都失败。
代码如下:
//watch
letmessage = ["query":true]
wcSession.sendMessage(message) { replyin
letdata = reply["data"]as!String
print("watch reply data:\(data)")
DispatchQueue.main.async{ [self]in
self.showMessageLabel.setText(data)
}
} errorHandler: { errorin
print(error.localizedDescription)
}
//phone
funcsession(_session:WCSession, didReceiveMessage message: [String:Any], replyHandler:@escaping([String:Any]) ->Void) {
varreply = [String:Any]()
reply["data"] = ["hi watch, nice to see you."]
print("reply:\(reply)")
replyHandler(reply)
}
既然不带应答的每次都成功,我就用这种方式发起请求,然后让手机收到消息后send message给手表是不是也行,然后……意料之中的失败了。后来又尝试了网友们说的updateApplicationContext,一样的失败。但是我发现手表给手机发消息,总是成功的,而手机给手表发总是失败的,代码中我也判断了session的activationState总是activated的,session的isReachable一直是true的。
能想到的都尝试了,于是我去论坛发表了问题。
但是也没人给回复ing
最后看见了这篇文章,感觉那叫一个亲切
下面有很多跟我遇到一样问题的人在跟进,但是也都没解决。看到最后,我似乎也释怀了,应该跟实现代码没太大关系,可能是苹果更新中,对WatchConnectivity修改了什么,这也只是我的猜测。
最后真心的要吐槽一下,app都要上架了,然后就这一更新用户就用不了,闹心……