美文网首页
让人闹心的WatchConnectivity

让人闹心的WatchConnectivity

作者: 爱技术的田同学 | 来源:发表于2021-06-19 11:23 被阅读0次

    最近开发一款手表项目,需要手机手表通信。选择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都要上架了,然后就这一更新用户就用不了,闹心……

    相关文章

      网友评论

          本文标题:让人闹心的WatchConnectivity

          本文链接:https://www.haomeiwen.com/subject/ewbryltx.html