 Watch开发学习 (三)

Watch应用的数据传输-与iPhone以及网络(WatchOS 1)

iPhone App、WatchKit Extension和Watch App之间的关系

自iOS8起Apple推出一个新的概念-App Extension,可以让开发者开发第三方的键盘、通知中心(Today Widget)等。


WatchKit Extension是iPhone App和Watch App通信的桥梁,下图展示了三者间的关系:

  1. WatchKit Extension(Extension)和Watch App(Host App)间的通信
    在Extension中可以获取到Watch App界面元素的数据接口WKInterfaceObject(非控件View本身,更接近于Model),通过修改WKInterfaceObject的数据,来修改对应Watch App的界面。另外通过Xcode将Watch App控件的响应事件绑定到Extension中,可以实现Watch操作响应逻辑的处理。

  2. WatchKit Extension(Extension)和iPhone App(Containing App)的通信

    1. 共享存储空间

      Extension和iPhone App之间的一种通信方式是读写同一块共享存储空间,达到数据交换的目的(见下图)。需要注意的是Extension和iPhone App属于不同的进程,要共享存储空间,需要在工程对应的target中同时打开App Groups的权限,并选择共享的组名(打开权限需要在Xcode中配置开发者账号和密码,同时本地需要有对应的开发证书,本文后面有介绍)。![]
      (http://git.devzeng.com/images/apple_watch_dev_glance/share_container.png)

    2. 直接进行通信(在WatchOS2中更加推荐)

      Extension和iPhone App另外一种通信方式是Extension主动向iPhone App发起请求,进行某种操作,或者请求数据(场景:Watch 收到新邮件通知后,点击已读按钮,在iPhone App上置已读)。

      WatchKit Extension中向iPhone App发送请求:
      + (BOOL)openParentApplication:(NSDictionary * nonnull)userInfo reply:(void (^ nullable)(NSDictionary * nonnull replyInfo, NSError * nullable error))reply;
      在iPhone App的AppDelegate中实现如下方法响应Watch App的请求:
      - (void)application:(UIApplication * nonnull)application handleWatchKitExtensionRequest:(NSDictionary * nullable)userInfo reply:(void (^ nonnull)(NSDictionary * nullable replyInfo))reply;

      在Github上找到一个叫做MMWormhole的开源库,它是专门用于Container App与Extension间传递消息,整个项目非常简洁实用。

      在WatchOS2中,APPLE公司特地做了一个类似于MMWormhole的framework叫做WatchConnectivity其中有一个最为关键的类叫做WCSession:NSObject

      这里贴出WCSession的一些代码和解释:(只支持iOS9及更新版本,在ContainerApp和Extension中使用一致)
      @interface WCSession : NSObject

      硬件是否支持:+ (BOOL)isSupported;

      单例对象:+ (WCSession *)defaultSession;

      拥有的Delegate:@property (nonatomic, weak, nullable) id <WCSessionDelegate> delegate;(在这里需要)

      delegate中使用较多的有:(接收信息后的一些处理)
      - (void)session:(WCSession * ) session didReceiveMessage:(NSDictionary<NSString * , id> *)message;
      - (void)session:(WCSession * )session didReceiveMessage:(NSDictionary<NSString * , id> * )message replyHandler:(void(^)(NSDictionary<NSString * , id> *replyMessage))replyHandler;

      激活对象:- (void)activateSession;(在APP生命周期中激活越早越好)

      发送信息:
      - (void)sendMessage:(NSDictionary<NSString *, id> *)message replyHandler:(nullable void (^)(NSDictionary<NSString *, id> *replyMessage))replyHandler errorHandler:(nullable void (^)(NSError *error))errorHandler;
      - (void)sendMessageData:(NSData *)data replyHandler:(nullable void (^)(NSData *replyMessageData))replyHandler errorHandler:(nullable void (^)(NSError *error))errorHandler;

      一般的使用过程:

      if ([WCSession isSupported]) {
      WCSession *session = [WCSession defaultSession];
      session.delegate = self;
      [session activateSession];
      }
      //接下来开始send或者receive
      

Watch App的启动过程和生命周期

当用户在Apple Watch上运行应用时,用户的iPhone会自行启动相应的WatchKit应用扩展。通过一系列的信号交换,Watch App和WatchKit Extension互相连接,因此消息能够在二者之间流通,直到用户停止与应用进行交互为止。此时,iOS将暂停应用扩展的运行。

在启动的过程中,WatchKit自动为当前界面创建相应的界面控制器。如果用户正在查看glance,WatchKit创建出来的界面控制器将与glance相连接。如果用户直接启动应用,WatchKit将从应用的主故事板文件中加载初始界面控制器。无论哪种情况,WatchKit应用扩展都提供一个名为WKInterfaceController的子类来管理相应的界面。

  1. 启动Watch App的过程



    当用户在Apple Watch上与应用进行交互时,WatchKit应用扩展将保持运行。如果用户明确退出应用或者停止与Apple Watch进行交互,那么iOS将停用当前界面控制器,并暂停应用扩展的运行。与Apple Watch的互动是非常短暂的,因此这几个步骤都有可能在数秒之间发生。所以,界面控制器应当尽可能简单,并且不要运行长时任务。重点应当放在读取和显示用户想要的信息上来。

  2. 界面控制器的生命周期
    当应用启动时,WatchKit框架自行创建了相应的WKInterfaceController对象并调用initWithContext:方法。使用该方法来初始化界面控制器,然后加载所需的数据,最后设置所有界面对象的值。


    在应用生命周期的不同阶段,iOS将会调用WKInterfaceController对象的相关方法来让您做出相应的操作。WKInterfaceController的几个主要的方法说明如下:

    • initWithContext:这个方法用来准备显示界面。借助它来加载数据,以及更新标签、图像和其他在Storyboard场景上的界面对象。
    • willActivate:这个方法可以让您知道该界面是否对用户可视。借助它来更新界面对象,以及完成相应的任务,完成任务只能在界面可视时使用。
    • didDeactivate:使用didDeactivate方法来执行所有的清理任务。例如,使用此方法来废止计时器、停止动画或者停止视频流内容的传输。您不能在这个方法中设置界面控制器对象的值,在本方法被调用之后到willActivate方法再次被调用之前,任何更改界面对象的企图都是被忽略的。

说明:glances不支持动作方法。单击应用glance始终会启动应用。

参考资料初识Apple Watch应用开发

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

推荐阅读更多精彩内容

  • 目录 1. 文档 WatchKit Programming Guide(中译) Apple Watch Human...
    XLsn0w阅读 1,809评论 1 5
  • WatchOS App架构与更新 (WatchOS 2) 前言 WatchOS2出现后,改变了很多东西: 其中最大...
    BBH_Life阅读 884评论 0 1
  • 写在前面 WatchKit Apple提供的开发专题页面如下: https://developer.apple.c...
    ch32053阅读 2,633评论 1 15
  • 许仙才知素贞与小青俱是妖类,耳边似起了几千道霹雳,直炸得自己头晕目眩,头昏眼花。他脚步虚浮地踏上家中小道,正走到庭...
    也难绾系阅读 476评论 0 1
  • 嗯,闺女泥丸暑假回来啦!虽然我还没见到那真实的男票。不过,感觉很靠谱噢。从你的状态里就知道了。击掌呵呵哒(⁄ ⁄•...
    温馨Unicorn阅读 201评论 0 0