watchOS 2 App开发前需要了解的

天气王是在watchOS 2已经发布了一段时间才开始做Apple Watch版本的,虽然这时网上已经有大量的Blog来介绍怎么开发一个Watch App,但是在准备开发时我还是迷茫了几天,不知道从何下手,不知道一个Watch App的结构要怎样搭建。直到看到了猫神的这篇文章《30分钟开发一个简单的watchOS 2 app》,才开了点窍= =!。后来想了一下,这些文章大部分介绍的都是WatchConnectivity中一些api的使用,大多是没有网络请求部分的,没有站在一个旁观者的角度去把Watch App的大致结构梳理一下,而是一头扎进了具体的某个技术细节点去讲解。

在开发前期评估工期时,我们会进行需求细化,现在回头看看当时细化的点真是可笑,大部分都是想当然的…。多希望你在Watch App的开发工期评估时能看到这篇文章,至少能让你对接下来要做的事心里大概有个数。本文会尽我所能将开发前需要了解的点列出来,后续文章会对踩坑最多的技术细节进行总结。

watchOS 2与watchOS 1的区别

这几乎是所有准备讲Apple Watch App开发的文章都会提到的点,但是这真的很重要,是一定要了解的。watchOS 1时代,在watch上只是存储一些资源文件和界面文件,主要的业务逻辑都是在iPhone上处理,每一次操作都要通过蓝牙传输数据。到了watchOS 2,watch与iPhone几乎完全脱离开了,它的所有业务逻辑都能在watch上处理了,只是在必要的时候要与iPhone做一些数据同步。有了新的与iPhone数据交互的框架WatchConnectivity,还能自己进行网络请求了,也就是说你将要用一些新的技术,为一个与iPhone不同的设备去开发App了。二者的结构如下图所示:

watchOS 1与watchOS 2的App设计

结构发生的变化,直接导致了我们在设计Watch App时的思路发生了变化。watchOS 1时,WatchKit Extension运行在iPhone上,这使得我们可以通过App Groups来共享数据,其实就可以拿开发Today插件的思路,来开发Watch App。数据的存储与iPhone App用的是同一个放在App Groups中的sqlite文件,网络请求部分还是通过iPhone上的网络去请求数据,再通过蓝牙同步到watch上。

但是到了watchOS 2,你就是要正常的从头开始设计一个App了!这当然就包括:数据存储、网络请求、UI搭建,再加上与iPhone进行数据同步,进而要思考每一部分怎样来实现。拿天气王的watch版本来说,数据存储部分是将对象归档,存进NSUserDefaults。网络请求部分直接用的NSURLSession,也可以用AFNetworking来处理。如果你原来的model不能直接拿来用,那这部分的工作量也不小哦,评估开发工期时要考虑好~

接下来讲的都是基于watchOS 2的

watchOS与iOS UI布局上的不同

Apple Watch的UI使用的是它自己的框架WatchKit,不同于UIKit,我大致总结了一下它的以下几个特点:

  1. 一个控件不能覆盖另一个控件。
  2. 控件不能在运行的时候动态增加或者删除,但是可以设置隐藏或显示,隐藏时会释放它所占的地方。
  3. 没有类似AutoLayout这样的约束,它自己会去帮你完成适配。
  4. 对于Table,只要设置有几行即可,也没有一堆的dataSourcedelegate方法要实现。
  5. Glance的布局只有固定几种,在storyboard中可以看到。
  6. 没有ScrollView这样的控件,当页面内容超出屏幕时,它会自动进行滚动。

分页结构的App

因为天气王的watch版本是个分页结构的App,所以这里也把这块要注意的点总结一下:

  1. 此处的分页不需要考虑每个页面的复用,WatchKit提供了一个简单粗暴的方法来直接设置分页:[WKInterfaceController reloadRootControllersWithNames:contexts:]
  2. WKInterfaceController没有提供添加和删除某一页的方法,所以要改变分页内容,只能再调一次这个reload方法。
  3. WKInterfaceController看不见时就会被系统自动销毁,比如当时我直接在InterfaceController中来调用的这个reload方法,然后又把它当做了数据源的代理,结果代理方法就是执行不了,原因就是reload出别的界面时,这个InterfaceController就已经被销毁掉了!

与iPhone的数据同步

watchOS 2中新增了WatchConnectivity来实现watch与iPhone的数据同步,其中主要是用以下几个方法来进行同步:

  1. [_session sendMessage:replyHandler:errorHandler:](天气王里有用到)和[_session sendMessageData:replyHandler:errorHandler:],这2个方法传递消息会很及时。如果watch端是处于活跃状态,那么在watch App中调用这2个方法,会将与其配对的iPhone上的相应App在后台启动(但是你看不见哦),但是反过来在iPhone App中调用这2个方法是无法启动对应的watch App的,所以在iPhone App中使用要判断可到达性。
  2. [_session updateApplicationContext:error:](天气王里有用到),会把最近的一次数据发送给对方。也就是说,如果我用它发出去了一次数据,对方没有处理,然后我又用它发了一次数据,那么这次的数据会把上次的给覆盖掉,也就是上一次的数据对方永远收不到了。此外,如果本次发送的数据是与上次一模一样的,那么本次的数据就不会发送了。
  3. [_session transferUserInfo](天气王里有用到),会把数据放到队列中,然后按照顺序发送出去,你也可以控制它暂停或取消发送。

好啦,说了这么多,到时候根据自己App的不同情况,选择用不同的方法处理吧~~后面我还会写专门的文章来详细介绍UI和数据同步这两块.

–END–

以上如果有说的不严谨的地方,希望在下面的留言中指出哦,如果对你有一些帮助,也希望能在下面的留言中给一些鼓励^_^