本文作者张忠良是滴答清单Apple Watch版应用的开发工程师,他用了一周的时间使用纯Objective-C语言完成了Apple Watch版滴答清单应用的开发工作。在这里,他从开发角度阐述了个人对于Apple Watch的理解,以及Apple Watch应用开发过程的经验心得,适合对iOS开发有一定了解的同学。

首先,开发Apple Watch应用必须掌握WatchKit Framework,这是Apple专门为Apple Watch开发而推出的一套新框架。这套框架中所有的类都是“WK”开头的,包括视图控制器类WKInterfaceController、WKUserNotificationInterfaceController,其他UI元素类比如WKInterfaceGroup、WKInterfaceTable、WKInterfaceLabel、WKInterfaceButton等。具体用法就不在这里赘述了,想要系统地学习WatchKit可以阅读Chun Tips的《走进WatchKit Framework》。

不过,我个人还是强烈建议大家有时间最好还是仔细看一遍官方原版文档,在帮助你更好地理解API来进行开发的同时,还能从一定程度上降低产生bug的几率。

滴答清单Apple Watch版本的开发基本上还是比较顺利的,有设计师和产品经理洒下的血和泪,本人差不多搞了一周,目前应用已经完成上线。在此,具体的开发过程就不详述了,无非是UI搭建和逻辑处理。简单讲几个开发中需要注意的点,希望对大家有所帮助。

  • 从技术上讲,WatchKit App类似于之前iOS 8上新推出的App Extension(应用扩展),比如Today Extension(今天扩展)和Share Extension(分享扩展)。只要你对iOS开发有一定经验,UI的搭建相对是比较容易的。重点在于如何让iPhone和Apple Watch上的数据同步,这时候问题来了,how?

请看:

1
-(NSURL *)containerURLForSecurityApplicationGroupIdentifier:(NSString *)groupIdentifier;

iOS 8之后,NSFileManager中有了这么个方法,假设你的应用已经支持了App Group(稍后会介绍),那么你肯定也有了groupIdentifier,调用这个方法会返回一个本地文件目录的URL。简单讲它就是一个共享文件夹,任何应用或者扩展,只要支持App group并拥有相同的Group ID,都对它有读写权限,这样一来数据同步就不是问题了。想详细学习这个的可以阅读《iOS 8 Extensions》,我只能说看了这个你不懂也难!不过,还是推荐大家阅读Apple官方文档,一样的道理,原版的才是最好的。

虽然数据是能够同步了,但是我如何在Apple Watch上知道iPhone上刚刚创建了一条新任务呢?不用想了,造轮子的成本又高且容易出问题,这里推荐MMWormhole,它是一个比较成熟稳定的第三方开源库,用在App Group内的通信,非常方便好用。原理就不讲了,有需要的同学可以去下载研究一下。

  • 搭建UI的时候你会发现Apple Watch并不支持AutoLayout(如果你还在手动布局,不要挣扎了孩子,好好学习AutoLayout),那么该怎么办?难道只能纯代码布局了么?

Apple当然不会这么土,WatchKit里有个类叫做WKInterfaceGroup,乍一看像是UIView,但是这货其实是用来布局的。从Storyboard中拉一个WKInterfaceGroup出来,在属性检查器(Attributes Inspector)中有个Layout属性,通过设置成Horizontal或Vertical,就可以让这个group下所有的子视图水平排列或竖直排列。再结合AutoLayout的知识,就可以轻松满足设计师大人的任何非人类要求啦。

  • WatchKit中的WKInterfaceTable不同于UITableView,没有dataSource和delegate,只能通过主动方式填充并展现数据。对应每一种不同类型的cell,都需要为它构造一个rowController(继承自NSObject),这个rowController负责往这种类型的row中填充需要展现的内容。

方法如下:

1
-(id)rowControllerAtIndex:(NSInteger)index;

通过调用这个方法得到指定行的rowController,再调用这个rowController的自定义方法来进行渲染。例如:

1
- (void)configureRowWithDataModel:(id)dataModel;

另外,如果要插入行和删除行,则要在上述操作之前先调用:

1
2
-(void)insertRowsAtIndexes:(NSIndexSet *)rows withRowType:(NSString *)rowType;
-(void)deleteRowsAtIndexes:(NSIndexSet *)rows;

到这里一切顺利,但不要太开心,Apple在这里挖了个大坑,请大家千万要踩进去!

我们在iOS开发中如果要刷新UITableView,只要更新数据源后再调用reloadData方法就可以。但是就像之前说的,WKInterfaceTable并没有主动刷新数据的方法,只能通过调用 [table setRowTypes:nil] 方法先清除所有数据,再用新数据源重新填充一遍。仅仅是这样就算了,还有更凶残的。

假设你现在视图控制器A中,然后被push到了视图控制器B,那么如果你在B中刷新A中的WKInterfaceTable是没有用的。但是不是完全没用,经过多次测试,我发现,数据源确实是被更新了,但是界面上的内容并没有刷新。也就是说,数据源和界面没有保持一致。翻遍官方文档和各大技术论坛,都没有找到解决方案,好不容易在开发者论坛发现这似乎是Apple的一个bug。

暂时的解决方法是,在需要刷新的时候记录一个标记位,然后在willActivate的时候根据这个标记位进行延时刷新。一个很明显的副作用就是刷新时会产生跳动,相信之后的版本Apple应该会修复这个问题。

再谈几点个人体会:

个人觉得不管是对Apple Watch持有乐观期望或是悲观态度,都只是针对智能手表这个新生平台而非产品本身。我相信任何一个挑剔的人都没办法从这个艺术品里挑出什么刺来。Apple在预售开始当天就不得不延迟了发货时间就很好的说明了它的魅力。

也许你们会说这是因为人们普遍会对新鲜事物产生好奇并积极关注它,并不完全是因为它很优秀,但是我们不得不承认,Apple Watch正在冲击智能手表平台甚至整个生态圈。健康监测、远程控制、移动支付,像这些操作成本小、周期短、时效性高的任务如果全都能托付给它,那我们的生活是不是会变得更加简单?

就拿滴答清单来说,一开始开发Apple Watch版本想到的就是加强提醒。手机放在兜里或者放在一边的时候,正好有一条任务来了,很可能没接到(我自己就经常遇这种情况),等想起来去查看手机的时候已经晚了。和手机不一样,Apple Watch戴在手上几乎不会出现人机分离,任务提醒也不容易被miss掉。

所以我们比较看重的是它在移动场景中表现出来的优势:解放双手,随时随地。手机也很方便,但也不会有人总是拿着手机吧,一旦手机不在手上的时候,很多事情就没法处理。虽然Apple Watch屏幕比较小,但某些场景下进行操作的时候会简便很多。

未来规划的话,也会主要从Apple Watch本身的优势出发,结合我们产品的一些特性。当前我们开发的Apple Watch应用,就像精简版的手机应用,只是加强了辅助功能。以后可能会尝试做一些跟手机应用不一样的东西,Apple Watch本身有一些强大的功能,比如监测用户的心率等数据,我们可能会根据这些数据做一些实时的智能提醒,当然都还只是些想法,有待检验。

Apple Watch应用开发经验谈:我遇到的那些坑的更多相关文章

  1. "回复 集赞" 抢 《Apple Watch 苹果开发教程》活动开始了!!!

    "回复 集赞" 抢 <Apple Watch 苹果开发教程>活动开始了!!!   活动方式: 回复积赞 第1步:回复该帖   扫描二维码进入活动现场 第2步:召集你的小 ...

  2. (转载)Delphi开发经验谈

    Delphi开发经验谈 开发环境-------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件. ...

  3. Unity3D游戏UI开发经验谈

    原地址:http://news.9ria.com/2013/0629/27679.html 在Unity专场上,108km创始人梁伟国发表了<Unity3D游戏UI开发经验谈>主题演讲.他 ...

  4. Apple Watch程序开发30分钟秒懂

    苹果公司Apple Watch智能手表正在备受追捧,迅速掌握Apple Watch的APP架构,环境搭建,及实例开发将会让开发者占尽先机.我赢职场全国首发,30分钟玩转Apple Watch应用开发实 ...

  5. Apple Swift中英文开发资源

    Apple Swift中英文开发资源集锦[apple swift resources] 找到的一些Apple Swift中英文资源原文链接,希望对大家有所帮助.欢迎大家补充,原始资源链接最好! The ...

  6. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  7. CozyRSS开发记录0-RSS阅读器开坑

    CozyRSS开发记录0-RSS阅读器开坑 1.RSS RSS,全名是Really Simple Syndication,简易信息聚合. 关于RSS相关的介绍,网上可以很容易的找到.RSS阅读器是我几 ...

  8. vue+node.js+webpack开发微信公众号功能填坑——v -for循环

    页面整体框架实现,实现小功能,循环出数据,整体代码是上一篇 vue+node.js+webpack开发微信公众号功能填坑--组件按需引入 修改部门代码 app.vue <yd-flexbox&g ...

  9. Django实际站点项目开发经验谈

    开发了两个月的Django站点正式上线了,看着网站从无到有,从前端到后台,从本地开发到环境部署,一点一滴的堆砌成型,着实带给我不小的乐趣. Django站点介绍: 开发环境:阿里云服务器centos6 ...

随机推荐

  1. 学习练习 java 线程

    package com.hanqi.xc; import java.util.*; public class lianxi extends Thread { public void run() { c ...

  2. Ugly Window 【acm题】

    话说好久没有碰acm题目了.............................. 看到Ugly Window这道题目,没有多想,就直接先找到字母的连续长度和连续高度,并统计该字母的总个数,然后用 ...

  3. PAT1069. The Black Hole of Numbers

    //这是到水题,之前因为四位数的原因一直不能A,看了别人的程序,才明白,不够四位的时候没考虑到,坑啊.....脸打肿 #include<cstdio>#include<algorit ...

  4. 【MySQL】Sysbench性能测试

    两台MySQL配置不一样,要测试下性能差别 [m1] long_query_time = 0.1 log_slave_updates innodb_flush_log_at_trx_commit [m ...

  5. form提交时,传递额外的参数

    在进行表单提交时,会遇到在提交前增加额外参数的情况,对此有如下几种解决方法: 1. 在表单里使用hidden的input,将参数放到里面. 缺点:在form表单里会增加一些input节点,感觉不爽. ...

  6. 音乐社交APP源码 V1.1

    1.关于音乐曲库,对接的是百度音乐,会自动随搜索链接百度曲库2.便捷聊天,采用xmpp基本架构.3.加入和整理了群聊天.4.分布式聊天,喜欢该专辑直接进入聊天,喜欢该音乐的进入聊天.5.采用兴趣社交和 ...

  7. 【风马一族_php】NO0_搭建web服务器

    原文来自:http://www.cnblogs.com/sows/p/5977996.html  (博客园的)风马一族 侵犯版本,后果自负 安装apache apache是一种B/S结构的软件,apa ...

  8. VS2012环境设置

    一 先安装水晶报表 开发者和用户两种 YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 保证完美激活!!! 激活码 一般网上的VS版本是使用版 要安装正版才能体验全部功能

  9. canvas绘制文字

    绘制字体时可以使用fillText方法或者strokeText方法. fillText方法用填充的方式来绘制字符串 context.fillText (text, x,y,[maxwidth]); s ...

  10. Java垃圾回收基础