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

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)。


VB数据报表设计器在多层结构开发的应用 VB突破 TextBox 32K 的限制 VB拖拽节点时实现目录树自动翻滚 位图文件内部初探-VB资料 VB文本的加密与解密 VB显示盘中所有的目录 VB压缩MDB文件 一个移动文件的简单方法-VB资料 VB移动文件到回收站 VB隐藏文本框控件的环境菜单(又一方法) VB隐藏文本框控件的环境菜单 VB用API复制移动文件 VB用OleDragdrop事件接受拖放文件 用VB进行文本文件的再处理 用VB开发应用程序如何使用INI文件 用VB实现文件查找功能 VB用Winsock控件实现文件的下载 VB用两分法搜索列表框或组合框中的数据 在 ListBox 之中, 如何检测鼠标所在位置的选项? -VB资料 在 Textbox 中,录入 N 个字符后移到下栏-VB资料 在 VB 中控制 Word 在GotFocus时快速选择文本 -VB资料 在VB中使用文件对象 在VB中使用艺术字 在VB中引用.dbf及索引文件 在Windows操作系统中改变文件打开方式-VB资料 在程序运行时,怎样把多个文本框的内容保存起来-VB资料 在打印字符串时自动换行 -VB资料 在文本框中快速增加一串字符-VB资料 在文本框中实现由加减号输入数据-VB资料 在引用项目找不到Excel、Word等Office软体Lib的解决法-VB资料 createfont怎样创建一个随意宽高的字体? 急,请问有函数可取字符串后面N位字符吗?在线等待 怎样显示报表页总数问题 在打印中如何实现实现小计(即每页显示金额的总和)100分 问一个简单的问题,关于初始化 请问谁有动态树状目录的原码啊,急需!! 什么问题,怎么解决? 西瓜:有人要求我贴你的没穿外套没穿鞋子的照片 就是你说生气的那张 贴不贴啊? 怎样将一个十进制数转换为二进制数,并将二进制数中的每一位单独取出来? GetProcAddress在VB中的使用? excel单元格格式问题 用按钮保存网页的问题 用c++ builder和access.数据表中的记录多了之后,应用什么方案将之备份以及恢复? 以下ASP在Win2000server上运行报错请问大家为什么??? 在指定位置输出文本 怎么办? 如何启动和终止一个NT服务 .Net——又一个起跑线 怎么样注册jsp上的jdbcoracle驱动 什么问题,怎么解决? 我的爱情大结局----失败爱情原闯文章 在学习了2个月的delphi后,总结四大问题! OnPaint()的问题?为什么我的程序要刷很多次才能得到正确的结果? win2000 Server中的终端服务问题,急,所有的终端都趴下了! 深入浅出MFC 100分﹕vs.net正式版的產品密鑰 怎样动态改变下拉框中的值? 如何将已有的程序(有源程序)封装成ActiveX控件? 讨论一个数据库建模的使用工具问题? 关于Flash的Action的小问题 怎样为xslt中的超联接加上参数? 问题 如何设置datagrid行背景颜色? 安装程序安装完运行显示“运行时错误'380':无效属性值”是怎么回事? win2000+ms proxy 2.0问题 API函数 ReadFile的pb的中文说明谁有,告诉我好吗? 在线求助 在线等待,急 关于计算字段,急! datawindow的scrollvertical.setrow,不能触发rowfocuschanged事件,why? help:can you tell me how can i get the IDE of WinSDK? 有些人的言论很具有误导性,根据今年的就业形势,软考证书还是比较值钱的 请看这段代码?谢谢 怎样删除session变量?? 求购POS机!!! 请问应该怎样学习COM技术? 求购POS机 my_storeproc返回一个结果集,能否对这个结果集进行子查询? 如何将MSFlexGrid1中内容导入Access数据库中 讨论:文件编辑,web方式 出现这样一个问题怎么办? 由几个完全相同的小正方形组成的图形,能否折成正方体求方法 聪聪和明明拿同样多的钱去买笔,聪聪买了12枝,明明买了8枝,钱正好用完,回家后,聪聪给了明明10元,每支笔多少钱? 设集合A=1,2 则满足A∪B=1,2,3的集合B的个数为为什么会是四个而不是八个 {2,3}为什么不是集合B?TMD 教材有错误!误人子弟! 请问书虫.牛津英汉双语读物(美绘光盘版)与非美绘版有什么区别? 明明有60本书,比聪聪多2分之1,明明给聪聪多少本书就一样多了呢 若集合A={1,2,3},则满足A∪B=A的集合B的个数,方法 方法注意是方法 五个同样大小的正方体组合成一个图形,无论从哪个位置观察只能看到 聪聪在一百货花了他全部钱的3分之2在二百货话了余下钱的3分之1这时还剩下4元聪聪原有多少钱 A={x|1.2} B={1.2.3.4} 满足A包含C包含B 的集合 C的个数为? 5个同样大小的正方体组成一个图形,无论从哪个位置观察都至少能看到几个正方形? ,答案1个5个同样大小的正方体组成一个图形,无论从哪个位置观察都至少能看到几个正方形? ,答案1个 为 在图中剪去1个小正方形,使得到的图形经过折叠能够围成一个正方体,先想一想,再试一试! 请您帮我把所有情况都列出并画下来!写完整给40分呢! 八年级上册物理第一章机械运动知识梳理图最好是图,{大括号也行不要太多,总结的 用5、6、7、8、9五张卡片,任意组成的五位数是单数的可能性是( )我知道答案是3/5,我要的是运算过程和理由. 如图所示,将给图形折叠后可以围成一个正方体,折叠后:(1)点P与哪些点重合?点C与哪些点重合?点A与哪些点重合 点B与哪些点重合 求书虫系列牛津英汉语双语读物中至少两部书中的经典句子每部至少两句,要英文的~1.威廉·莎士比亚 William Shakespeare2.一个国王的爱情故事 The Love of a King3.亡灵鸟 Dedd Man's Island4.哈克贝利·费 用5、6、7、8、9五张卡片,任意组成的五位数是奇数的可能性是(). 如图所示,将该图形折叠后可以围成一个正方体,折叠后:(1)点P与哪些点重合?点C与那 人教版初二物理上册第一章机械运动第一节长度与时间的测量第15页答案动手动脑学物理第一题答案 用5.6.7.8.9卡片,任意组成的五位数是单数的有kuai 空集与A的交集是什么?1.空集与集合A(非空集)的交集是什么?2.为什么{x|x>2}∪{x|x2,或x 外研社出版的英汉双语读物小说怎么样?我想提高英语,想读读小说,带有翻译的,但不知道质量怎么样? 5,6,7,8,9.5个数字任意组成5位数是单数的可能性是几? A和空集的交集是什么 telephone 的中英文歌词,先是英文的,然后是中文的 4、8、9三张卡片组成三位数是奇数的可能性是多少? 集合A和集合B交集 设集合M=(1,2,3m-6),N=(-1,3),M交集N=(3),求m. 书虫牛津英汉双语读物的MP3的朗读者都是地道的英式发音吗? A与A的交集是空集吗 m的集合元素有0,1,2,3,4.;n的集合元素有1,3,5,已知N的集合是m与n的交集,求N的子集有几个? 2012年小学五年级寒假作业数学部分答案 谁能帮我总结一下沪科版物理八下期中知识点? 设集合m={1,2,5}.N={2,3,4,5,6},则M∩N= 聪聪和明明在商店买同样的笔记本,聪聪买了四本,共花了2.4元钱;明明买了6本,共花了3.6元钱.聪聪和明明买笔记本本数之比是():(),比值是();花的钱数之比是():(),比值是(). 宇航服质量为120kg,抗压能力超过120kpa,当穿着它在太空中行走时,他周围气压是多少 3和4题~ 聪聪说我4分钟跑了1200米,明明说我6分钟跑了1800米.用以上4个数据,组成比例 聪聪书本数的2/1是5本,明明书本数的3/1是5本,猜猜他两的各书本数是多少? 围棋盒中有x枚黑色棋子,y枚白色棋子,现从盒子中取出一枚棋子,如果它是白色棋子的概率为七分之二,则...围棋盒中有x枚黑色棋子,y枚白色棋子,现从盒子中取出一枚棋子,如果它是白色棋子的 聪聪4分钟跑了1200m,明明6分钟跑了1800m.用以上四个数据,能组成几个比例?请写出来.注:比例和比不同,例:4:1200=6:1800 2012九年级国标版轻松快乐过寒假 若集合A={x|-2-2},A和B的交集={x|1 聪聪和明明同算两数之和,聪聪得685,计算正确;明明得280,计算错误,明明所以算15分钟内有奖金!100这里连着问题 错的原因是将其中一个加数末尾的0漏掉了.你知道两个加数各是多少? 聪聪和明明两人共有200元压岁钱,如果聪聪给明明15元钱,则明明与聪聪的钱数比为11:9,明明原来有多少钱 已知全集A=AUB={X属于N|0 书虫英汉对照读物的书目 聪聪用压岁钱的一半买了一个新书包,又用剩下的一半买了几本文艺书,还剩15元,聪聪的压岁钱一共有多少元 已知集合A={x|1 2013级八年级上册英语书是什么版本的 如果可以的话希望能把2013级八年级上册英语单词带汉译(最好有音标)发给我 八年级上册青岛出版社物理新课堂答案 若集合A={x|-2-2},A和B的交集={x|1 2013年英语书上册的在哪儿可以买啊!急用! 平移前后图形的形状()、()改变了 在围棋盒中有x颗黑色棋子和 y白色棋子,从盒子中随机抽取一颗棋子为是黑色棋子概率3/8,求x/y之间的关系式x、y的关系式,x=——y 5个同样大小的正方体组成一个图形,无论从哪个位置观察都能至少看到( )个正方形?为什么5个同样大小的正方体组成一个图形,无论从哪个位置观察都能至少看到1个正方形呢? 优+学习方案 第28页 图形经过旋转和平移后图形的形状( ),大小( ),位置( ) 若{1、2}包含于A包含于{1、2、3、4、5}则满足条件的集合A的个数是 5个同样大小的正方体组成一个图形,无论从哪个位置观察都至少能看到几个正方形? 观察平移后图形顶点的位置,你发现了什么? 集合A={1.2.3},则满足A并B=A的集合B的个数是几个?为什么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘