Apple Watch之watch app开发知识点 (通信部分)

开发watch app的相关资料

说实话,基本上没有什么现成的资料。apple watch实在是很小众的东西,远不如iPhone那么普及,想开发一款完整的watch app能找到的资料实在是很少,想开发还是得去看看苹果给的英文文档。当然,如果你的需求不是比较复杂,可能仅有的那么一点中文资料就足够了。但是,如果你的app是和运动相关,可能就比较复杂了。言归正传,下面将讲一些在app中会用到的东西,可能面对的一些问题。

watch app与iOS app通信

https://www.natashatherobot.com/watchconnectivity-say-hello-to-wcsession/ 这是外国人写的,国内已经有人翻译,而且在网上基本上搜的都是这篇,强烈建议先看下这个Demo,顺便查下资料,了解一些基本知识点儿。在这里只是根据实际开发情况进行补充,对踩过的一些坑进行总结。

首先,解释下为什么需要有个“WatchSessionManager”单例来专门用来通信。一般来说,如果在做iOS app时,如果不是需要长链接的话,比如说http/https请求,对一个控制器而言,网络请求都是在移动端主动发起,是移动端向服务器去拿数据展示,或者向服务器上传数据,主动权都是在客户端,干完事儿了,服务器与客服端就断开了。当然长链接的话就不是这样的情况了,有可能出现客户端是被动接受信息,比如说账户被挤下线,就是长链接状态下,另一台手机登录了你的账号,也许你的手机并没有做什么请求网络的动作,而你还是下线了,这是因为服务器与你的手机一直保持长链接状态并没有断开,这时服务器可以随时向你手机发送消息,从而让你下线。同理,在开发watch app时会发现,基本上watch app除了主动发起通信,还会被动接受通信,在iOS app端同理,总之一句话,就是互相控制。如果用过CocoaAsyncSocket的话,这些自然了解,而且“WatchSessionManager”可以说就是写个watch版的CocoaAsyncSocket。用WatchSessionManager来统管网络通信部分,控制器只是其代理,用来接收WatchSessionManager传来的数据。

言归正传,“WatchSessionManager”有两个,一个写在iOS app中,另一个写在watch app中,Apple watch和iphone之间的通信靠的就是它们两个,而且,其中完成通信的核心部分是“WCSession”(见图三),以私有成员变量的形式,分别存在于两个“WatchSessionManager”中,要注意的是,虽说都是“WCSession”,但是,一个是在iOS app 中,另一个是在watch app中,硬件环境不同,注定了就算大部分方法和成员变量是相同的,但仍有一些方法或者成员变量是不同的,这些点在外国人的Demo中表现的并不是很明显,看他的代码要是不熟悉基本知识,会有些云里雾里。


在iOS app中的“WatchSessionManager”,图一


在watch app中的“WatchSessionManager”,图二


在iOS app中的“WatchSessionManager”部分代码,图三


最常用方法:

通信中,最常用的代理方法:open func sendMessage(_message: [String:Any], replyHandler: (([String:Any]) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? =nil) 和 open func sendMessageData(_data:Data, replyHandler: ((Data) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? =nil)

贴一段在watch app中“WatchSessionManager”的方法

watch向iphone发送信息的方法,图四

在该方法中,我使用的是WCSession实例方法中有replyHandler这个参数的方法(open func sendMessage(_message: [String:Any], replyHandler: (([String:Any]) -> Swift.Void)?, errorHandler: ((Error) -> Swift.Void)? =nil))来发送信息到手机(即iOS app),从该方法可以看出,传递的信息是字典的形式存在,例如参数message和replyHandler,所以,图中可以看到requestValues是以字典的形式传送到手机上。有发信息就有收信息,在iOS app中的“WatchSessionManager”实现了“WCSession”的代理方法:public func session(_session:WCSession, didReceiveMessage message: [String:Any], replyHandler:@escaping([String:Any]) ->Swift.Void),来处理watch发来的消息。要注意的是,在实现该方法时,最好要调用叫做replyHandler的block,虽然不一定要调用,但是这个block可以方便“响应”请求,以简洁的代码返回消息,如果不是调用这个block,你就得自己再在iOS app端调用“WCSession”的发送消息的方法来“响应”请求,这个相对而言就麻烦了些,而且,不调用这个block,是会报超时错误的,但不会崩溃。

其他常用方法:

“WCSession”实例的:open func updateApplicationContext(_applicationContext: [String:Any])throws

在实际开发中,需要手机向手表发送图片,让图片在手表上显示出来,最开始还是使用上文中最常用的方法,但是发现有的图片传不过来,控制台打印出“负载过大”,去网上搜了下,有国外的大神回答了过该问题,答案是“sendMessage:the size limit (iOS 9) is 65.5 kB,The size limit for updateApplicationContext is 262 kB.”,最常用的方法最多只能传65.5kB的数据,而updateApplicationContext则能传262kB的数据,图片很容易就超过100kB了,所以果断换成了在iOS app中使用updateApplicationContext来传送图片到watch。


在“WatchSessionManager”的扩展中,实现了“updateApplicationContext”,图五

使用updateApplicationContext还有一个原因是,当iOS app被手动杀死时,我们需要在watch app中做一些保存或者退出的业务,这个时候,最常用方法也是不起作用的,而updateApplicationContext是支持iOS app被杀死时,向watch app发送消息。首先,在iOS app中注册通知


监听iOS app被杀死的通知,图六

监听到通知时调用的方法


通知对应的方法,图七

在watch app中接收信息的方法,


接收消息的方法,图八

写得好累,暂时就写在这里,之后还会有其他知识点陆续放出。第一次写博客,不好的地方,尽管喷,我虚心接收,激励我越写越好。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 写在前面:转眼间,我的小侄女已经快要两周岁了,不禁感叹,时间过的真快啊。从刚出生仅有6斤6两的小娃娃,长到如今已经...
    亭子的后花园阅读 281评论 0 0
  • 人间私语:人生不如意事常八九 编著 摄影 封面 插图:辜晓波 编著声明:(1)图文无关;(2)编著内容仅供参...
    四方辐辏阅读 625评论 55 48
  • 好安静,电影怎么又停了?n揉了揉眼睛,看着床边的手机,手机里面开着视屏软件。 手机好热,赶忙拔下了充电器,“妈的,...
    多么难的相遇阅读 536评论 1 1
  • 36期亲子班第6组-殷光琴 (张镐然10岁)加油! #口号(只有感觉好才能做得好) 孩子第三个30天目标: 1、英...
    yincarol琴阅读 168评论 0 0