说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Apple Watch应用开发:从再造墨迹天气谈起

HTML文档下载 WORD文档下载 PDF文档下载
本文作者刘超在墨迹天气主要负责iOS平台软件开发工作。他将从软件开发角度,分享墨迹天气团队在针对Apple Watch开发手表App过程中发现的问题、误区,以及解决之道。

编者按:本文作者刘超在2012年加入墨迹天气,主要负责iOS平台软件开发工作。在今年年初,墨迹天气团队针对Apple Watch的硬件与交互特点,对应用做了重新设计与开发。作者从软件开发角度,分享了墨迹天气团队在开发过程中发现的问题、误区,以及解决之道。

Apple Watch的设计误区

WatchKit发布第一时间,我们的产品经理和设计师就根据设计规范和官方宣传动画迅速出了一版设计原型。Apple Watch版应用中囊括墨迹天气iPhone版的大部分功能,从实况到预报,再到时景和分享,其中包括一些新的交互,如使用Digital Crown切换短时和多天预报、缩放时景图片,在消息推送达到后直接在该推送下编辑信息回复。它相当于一个微缩版本的墨迹天气。

随后程序员也很快加入到这个项目里。当我们研究过Programming Guide和Watchkit framework Reference后,失望的发现宣传视频上展示的操作:Digital Crown、表面触感、地图缩放等是不对开发者开放的。于是我们开始重新推敲交互,设计师也发现不能再像设计iPhone应用那样自由的设计细节。由于最初我们都是没有实际的佩戴体验的,只能从宣传片和设计开发指南中找思路,揣摩用户的使用场景和心理。通过和Apple方面有佩戴经验的负责人交流,我们发现最开始的设计方向是不对的,我们不应该把设计重心Apple Watch的主程序上,而是重点设计Glance和Notification。作为一款手表上的应用程序,及时方便地查看才是它最常见的应用场景。曾经看到一位没有使用过Apple Watch的网友调侃:在那么小的屏幕上操作带来的麻烦完全抵消了从兜里掏出手机的麻烦。

Watch应用开发的五条小技巧

WatchKit提供的是一套全新的界面类。令人熟悉的地方是,大多数方法和属性的命名都有很好的延续性,几乎不需要重新学习就能够大概看出其含义。不同的是所有的界面控件都继承自 WKInterfaceObject,也就是说这些界面控件不再是继承自UIView的控件实体,而更像是控制真正界面的代理控制器。

在进行开发之前,我们要先了解一下Watchkit是如何工作的。实际上一个Watch应用分为两部分,负责界面的WatchKit App,只包括storyboard和asset catalog,它运行于Apple Watch上,另一个是负责逻辑部分的WatchKit Extension,则运行于iPhone上。开发者可能会担心,这样会不会加大开发的难度呢?答案是完全不会!Apple Watch和iPhone使用Bluetooth LE 和 Wi-Fi 技术进行通信,整个通信过程实在后台完全自动进行的,所以即使界面和交互在Apple Watch上,逻辑在iPhone上,我们却根本不需要操心,只要像常规那样处理界面属性赋值和交互响应即可,确实很酷!

首先是界面开发,在使用WatchKit开发时,不会再出现“代码写UI还是Xib写?”这样的带有争议的问题,因为Watch应用只能用StoryBoard进行开发,我猜想是为了更好的控制Watch应用的界面一致性,除此之外还有比较多限制。譬如不能在运行时动态增减界面元素,只能通过设置隐藏属性来调整界面展示;元素之间不能出现叠加,只能按纵向横向依次排列; Glance必须从官方模版中选择一个来使用,不能自由堆砌界面元素等等。不过最终开发下来,发现只要运用得当,空间还是很大的,在此我们根据实践总结了一些小技巧:

  1. 使用 WKInterfaceGroup WKInterfaceButton - setBackgroundImageNamed: - startAnimatingWithImagesInRange:duration:repeatCount:方法在背景上增加图片或者动画,这样就可以使控件和图形实现叠加。有些小伙伴可能会觉得很惊奇,“什么?WKInterfaceButton也可以作为容器放置控件?”是的,只要在控件的Attributesinspector里把Button的Content属性由Text修改为Group即可,这样我们就可以像使用Group一样使用button了。
  2. 抬手即看的短暂应用场景要求我们必须开发出层次简洁、操作流畅的应用,过程中我们发现WKInterfaceMenu的使用效果非常生硬,实际操作时需要长按才会响应,另外当弹出的选项偏少时,界面并不美观,所以后来用WKInterfaceButton的轻点事件取代了这种长按操作。
  3. 在控件的Attributesinspector里,可以针对38mm和42mm的Apple Watch分别设置属性。
  4. 如果想让一组横向放置的N个控件等宽,可又因为不知道设备类型而不能设置具体的宽度,该怎么办呢? 一种比较土的办法是,在程序运行后,通过获取屏幕宽度来动态的设置控件宽度。另一种方法是直接在该控件的属性设置里把宽度设置为Reletive to Container,然后在其下方的输入框内填写所占比例,例如5等份,就填写0.2,这样系统会按照你的设置自动帮你设置好。
  5. 在传统的基于界面的iOS应用中,程序可以在AppDelegate里做好界面展示的准备工作,但是Watch应用必须直接指定某个界面为入口。如果你的根界面是一个基于分页的结构(page-based), 可能会碰到这样的问题:程序在启动后才动态的决定分页数,所以需要在页面内调用reloadRootControllersWithNames来重新加载,如果加载的页面中不仅包括加载者自身又没有做处理的话,就会无限加载下去,这时候你可以使用一个static变量来解决无限reload的问题,如下:

- (void)awakeWithContext:(id)context {<br>&nbsp; [superawakeWithContext:context];<br>&nbsp; static BOOL bReload = NO;<br>&nbsp; if (!bReload) {<br>&nbsp; bReload = YES;<br>&nbsp; //计算分页数,准备各分页context数据<br>&nbsp; //调用[WKInterfaceControllerreloadRootControllersWithNames: contexts:]加载分页<br>&nbsp; }<br>&nbsp; else {<br>&nbsp; //处理输入的context,这里不加载界面,willActivate执行时再lazy加载<br>&nbsp; }<br>}

当用户抬起手腕打开Glance想看一下天气时,如果程序此时才去进行数据请求,用户就会面对一个大大的N/A界面,需要等上1~2秒,直到网络请求成功,才会显示最新的天气信息。这会带来较差的使用体验。相对来说,我认为比较好的做法是,先让iPhone应用支持后台刷新的系列功能,包括:silent notification、background fetch。如此一来,当用户查看Glance时,呈现给他的是近期更新过的数据,随后程序做出判断,如果这个还需要呈现给用户更新的数据就立即进行网络请求,请求成功后再更新界面。


数据共享与通信

Watch应用和containing iOS App之间可以通过共享数据区进行数据共享。首先启用App Groups,然后在共享容器内根据要共享数据的性质来决定是用NSUserDefaults还是直接在共享区读写文件。官方Demo推荐用NSFileCoordinator来进行文件读写,以完成多进程间的同步。不过,我自己在实践过程中发现,使用NSFileCoordinator时必须特别小心,使用不当会造成因资源引起的死锁。当时情况是这样的:程序上的一个bug导致在个别情况下会出现特别频繁的IO,以致程序几乎失去了响应。这时候如果直接将程序kill掉,资源所在目录有几率发生死锁,如果重启App,程序会卡死在NSFileCoordinator的coordinateReadingItemAtURL方法上。该方法的回调block长时间得不到执行,以致于iOS的”看门狗”会直接将App干掉,启动不起来,只能依靠重启系统来解决。对App开发者来说简直是“人间惨剧”,这种情况下没有几个用户会不删掉App的。

由于atch应用只有运行、挂起、终止三种状态,所以一旦你正在使用NSFileCoordinator写文件时被挂起,它就没有机会让出资源所有权。要解决这个问题,需要使用原子安全的保存操作,如UIDocument。

如果你需要Watch应用同containing iOS app进行通信,可以使用WKInterfaceController类的类方法openParentApplication,反过来如果需要containing iOS app同watch app通信,一种办法是通过在数据共享区读写文件,然后让watch app监听该文件从而做出响应;另一种方法,是使用Darwin Notification Center,具体开发过程,可以参照 官方的建议。

性能方面

关于这一点,官方给予的建议非常明确,简要列举如下:

  1. 尽可能减少iPhone和Apple Watch之间的数据通信,比如尽可能把图片存在WatchKit app bundle里,这样显示图片的时候会更快更省电。
  2. 仅更新界面上改变的部分,比如需要对 table新增了一行数据,不要重新加载整个table。
  3. 减少分页结构应用的加载时间,在init和awakeWithContext做尽可能少的处理,界面如何展示的问题放在WillActivate内处理。
  4. 让一个Controller负责尽可能少的场景,因为当显示其中一个场景时必须要隐藏不需要的控件,但是隐藏控件也会被创建,就会影响加载速度。

其它Tips:

官方论坛的Apple Watch模块里有很多有价值的问答,苹果的工程师会在里面对开发者的疑问进行解答。推荐下载官方Demo Lister,这是一个非常不错的开发示例。但是要注意,Demo里大量使用iOS 8及其以上的API,如果你的App还需要支持iOS 8以下的系统,在Copy代码时请做好兼容。

XCode 6.2版本有一个小bug,就是必须把相关target的Bundle Display Name 和 Bundle Name都配置为我们的应用名,才会在Watch应用启动和iPhone上Apple Watch的配对程序里正确的显示应用名称。

另外,还要给使用XCode6.2的开发者提个醒,不正确的现实应用名称有可能会被审核拒绝。需要支持国际化的开发者要针对所支持语言在infoPlist.strings内配置CFBundleName的值即可。

写在最后

根据Apple在iOS系统上日益开放的策略,我们有理由相信,随着时间的推移WatchKit会开放给开发者越来越多的API。各种App也会更准确的捕捉到Apple Watch的应用场景,开发者也会有更大的舞台去发挥!

作者简介:刘超,2012年加入墨迹天气,主要负责iOS平台软件开发工作。墨迹天气正在寻找技术高手,欢迎感兴趣的中高级iOS工程师交流。chao.liu#moji.com 


CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面,如果您有想分享的技术、观点,可通过电子邮件(tangxy#csdn.net,请把#改成@)投稿。

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。


见证新一代全能大数据计算平台崛起 ——中国Spark技术峰会将于4月19日在北京召开 大佬放猛料的节奏 阿里云聚无线为开发者提供一站式服务 智能硬件又添新选手 汉王推出便携PM2.5检测仪 2014年首场百度轻应用高级训练营落幕 现场展示云端结合能力 销售易史彦泽:企业应用,自上而下的革命 专访寻医问药网创始人:轻应用背后的长尾效应 轻松打造品牌轻应用:实时Web App开发框架Clouda Intel强势入驻,Cloudera新一轮融资总额已达9亿美元 每个Web开发者必备的9个软技能 4月1日:闻名世界的苹果公司正式成立 AMD正在探索一种新颖的Linux开源驱动模式 QQ手机浏览器推出5.1播霸版 内置强解码引擎支持22种视频格式 Ceph浅析(上):概况与设计思想 IBM:你好,互联网 光网络SDN化的四大驱动力及两条路径 《近匠》酷传:解除App发布和监控痛苦 有道heX正式开源:用HTML5和NodeJS开发桌面应用 在3D空间创作:英大学生发明增强现实设计产品 2014年3月浏览器份额:Chrome终超Firefox 成市场第二大浏览器 2014年3月操作系统份额:Windows 7大涨,Windows XP仍未跌破27%大关 路透社:iPhone 6仅有4.7寸版本,将于5月量产,5.5寸遭冷冻 高端实战技术培训:OpenStack企业应用之路 据统计,Oracle已击败IBM跃居软件行业第二 【技术博客推荐】2014年值得关注的10个开源项目 Intel在深圳建立智能设备创新中心 将投入1亿美元 免费获得价值1200元Unity2014顶级盛会门票! IBM公布Softlayer中国业务落地时间表 推荐30款最佳的数据可视化工具 数据库迁移测试:选白盒还是黑盒? 东软发布首款英特尔架构企业级移动终端解决方案 英特尔与腾讯创立游戏创新实验室 推进RealSense技术 DELPHI非常非常非常简单的问题 在两个页面中,需要传递密码,如何使密码在地址栏中不可见? 一个关于DW的问题 难道是系统的问题,晕!! 调查:北京和上海的pb 的程序员能挣多少钱? 谁知道用odbc连接infromix online参数怎么设?(50分 ) ASP如何实现票据打印 请问MYSQL可以支持哪些数据库文件或表格的导入? 急死我了!求教高手有关焦点的问题! 谁有《COM技术内幕》的第13章的例子的源码,送100分,谢谢先! mysql的最大链接数在哪里修改? 图像区域选取,高分求解! Shell_NotifyIcon问题 在PL_SQL中怎样用一个表中的数据去更新另一个表 oracle 9初学者 sybase的JDBC驱动字符串是什么阿?? 如何播放Flash? 我的IE不能自动填写域名了!!!第一个答对者20分! 一個很簡單的問題,在線等候,謝謝!! /usr/bin/top的原码在哪个路径下啊?小弟找了好久还是找不到急啊! 尊敬的流芳先生: 程序员考试中的一道很简单的c试题,有个问题 Sun Blade 2000 要多少钱? 活动目录中,遇到这个问题。 我的机器用程序向局域网内的另外一台机器发送一条信息,类似于发送控制台信息 [请教]会用客户端ftp软件客户端代理功能的进来帮帮忙 急求VCD的Specification! 在线紧急求助!!! 在MDI中如何更改子窗口标题? 请问有哪位好心的大哥能给我一个Bounds Checker V601_D.exe 的序列号? 100分求助如何在iPlanet中配置cgi-bin? 高分求助:请问如何确定某个窗口是否存在? 怎么样在vb中把一个excel表的数据拷贝到另一个excel中(包括行高,列宽,字体等) In Pro*c, 为什么我不能用#define UNAME_LEN 20 去定义常量. 高分 高分求《.NET开发的最佳实践与案例分析--北京讲座》示例源码及相关资料!!! 请教高手 那们有 AlphaBlend 函数的帮助中英文都行。 麻烦大家帮我看一下,代码错在那里。 详细说说rs.open sql,conn,Cursor Type,LockType 紧急求救!在线等待: 哪里可下载INTEL IPL库? 关于 我的GNOME的主Panel消失了,我该怎么办???? 一个C程序的问题求助! 请大家推荐一个支持EJB2.0 的免费的应用服务器 运行时建立数据库表 麻烦各位一下,这个错在哪了? 关于access关于自动增量的字段! 关于快捷菜单的问题。 世界上最大规模的大学生群架[真实](转载) win2000日文版与98SE怎么连接? 《天上的街市》阅读答案(其实只有一题~)天上的街市 郭沫若(郭开贞) 远远的/街灯/明了,好像是/闪着/无数的/明星.天上的/明星/现了,好像是/点着/无数的/街灯.我想那/缥缈的/空中,定然 天上的街市练习答案使人从地上的街灯联想到了什么 他们之间有什么关系 如图所示电路中,电源电压恒定,断开S1,S3,闭合S2,两电表均有示数;在断开S2,闭合S1,S3,此时两电表的如图所示电路中,电源电压恒定,断开S1,S3,闭合S2,两电表均有示数;在断开S2,闭合S1,S3, 去哪里可以免费用天文望远镜看太空捣乱不说人话的我会替大伙问候你妈的 广告上的错别字(带街道) 我想对凡卡说300字 从小事做起.从自身做起,预防违法犯罪行为的格言警句成语,越多越好 天上的街市习题诗中的牛郎织女和民间的故事有什么不一样? 凡卡续写300字 名言警句 从小事做起的重要性 有错别字的街道名称急用! 哀词和冰神读后感 求一些关于从小事做起的名言警句最好注明出处, 《天上的街市》的习题读了《天上的街市》,我仿佛看到了:( ). 续写凡卡300个字啊不过记住,在当时沙皇统治下,是不能有什麽好结局的.只会有死路一条.不要太长啊 求《皇上 有种单挑本宫》全文txthelena1996 sina谢谢麻烦重新发送一下到807095128.q 仿照五年级上册的语文书中的一篇课文《冬阳•童年•骆驼队》第四段写关于小动物的一段话!写两三句话就行!不要太多!小动物的!最好是小狗小猫~我说是最好,不是也行! 《凡卡》的续写(300字以上) 《皇上,有种单挑本宫?》全文TXT 作者:abbyahy《皇上,有种单挑本宫?》全文TXT 注意是要{全文}!连载已完结.注意是要{全文}!不全不给分,不全发了也不讨好. 有努力才有真正的美丽 美文400字左右 有的发 凡卡的续写300字以上. 植物也会"思考"?抱歉.没有内容.呵呵.应该难不了大哥大姐吧!你能找出“直到现在才意识到植物比我们认为的要能干得多”的两点原因吗? 记金华的双龙洞,按浏览顺序依次写了双龙洞的什么? 六年级课文有破折号的句子 植物知道些什么秦珍子阅读答案1.这篇说明文的说明中心是什么2.文章第一段的疑问句有什么作用3.文章介绍了植物哪方面不为人知的能力4.最后一段从比如开始运用了什么说明方法?有什么做 课文手指的理解和感受课文[手指]中说说对它的理解和感受 说说自己的见解是怎样获得的 是如何加深的 错别字作文要400字 天文望远镜能看清飞机吗天文望远镜能看清飞机的型号,看上去是正的还是倒的? 手指 这篇课文最后一自然段有三对反义词 第一对是什么?找不到. 已知α+β=1,αβ=-1,S1=α+β,S2=α^2+β^2,S3=α^3+β^3…Sn=α^n+β^n(1)计算S1= ,S2= ,S3= ,S4= (2)试写出Sn-2,Sn-1.Sn三者之间的关系式(3)根据以上得出的结论α^7+β^7 谷歌天空和天文望远镜哪个好如题比较清晰度~10000元左右的天文望远镜吧 大街上的错别字 街头错别字作文400字 要有2个具体事例哦 谢 1000多元的天文望远镜能看到太空吗? (√1)^2+1=(√2)^2=2,S1=2分之√1 ,(√2)^2+1=(√3)^2=3.S2=2分之√2 ,(√3)^2+1=(√4)^=4,S3=2分之√3用含有n的等式表示上述变化规律;求(S1)^2+(S2)^2+(S3)^2+.+(S10)^2的值.三角形两条直角边与斜边的关系,用一 “人的一生有两件事不可避免:死亡与纳税” 英语翻译好像是一个外国名人说的,大家有知道原文是怎么样的吗?谢谢啦!对了,那个外国人叫啥呀?谢谢 记金华的双龙洞为什么要写一路上的见闻 这些话中的破折号有什么作用(人教版小学语文六年级上册19课一面《5+2》上的题目)填序号破折号的作用:1.表示解释说明;2.表示话题转换;3.表示事项的列举;4.表示声音的延续、拖长; 高一英语听力人教版求回复 1.若某人乘坐出租车在平直公路上匀速行驶,右图为他到达目的地时的车费发票.求 TAXI(1)出租车行驶的时间; 车费发票(2)出租车行驶的速度 车号 E.U-8888日期 02-05-28上车 10:00下车 10:05 记金华的双龙洞 内洞和外洞的共同特点 求六年级现代文·文言文点击《天上的街市》答案,请尽快给予答复,thank. 大自然的花香阅读答案 《记金华的双龙洞》作者游览双龙洞的顺序是 路上-----( )------( )------( )------( )------( ) 求以美丽无须包装为题的作文开头与结尾! 记金华的双龙洞都写了外洞的哪些情景,特点是什么 作文 与认真有关的400字 六年级点击《天上的街市》答案!~~~急!~~~~~~~~~~ 记金华的双龙洞介绍内洞时写了哪些景物 记金华的双龙洞 作者描写了路上( )的景色,( )的溪流,外洞的( ),内外洞连接处空隙的( ),内洞的( )、( )、( )的特点 六年级第一学期语文《点击》答案 《记金华的双龙洞》的外洞描写运用了什么说明方法 努力向上的阶梯 作文400字 诗歌第一节中的动词可以互换位置么?为什么?神话传说中的牛郎织女,最终被王母娘娘用“天河”隔开,只有在阴历七月七日这一天才能相见,是一个悲剧故事.而作者在诗中却写得那样畅快,“天 4 记金华的双龙洞 内洞重点写了什么特点 《天上的街市》练习题1.体现了诗人_____的创作特色.2.最后一节诗的韵脚及特征是.3.第二节诗写想象中的街市,是从第一节的“_____”自然引出的.4.“你看,那浅浅的天河”一句中在"你看"后加上 天上的街市点击答案急用,现在必须要! 与植物相处 天上的街市阅读训练高手进天上的街市 远远的街灯明了,好像闪着无数的明星.天上的明星现了,好像点着无数的街灯.我想那缥缈的空中,定然有美丽的街市.街市上陈列的一些物品,定然是世上 找错别字,错别字什么的最讨厌了
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘