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

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


InputSream输入流转String字符串,Android开发工具类 Android中的正则表达式Regex使用 优化Dalvik虚拟机的堆内存分配 Android标题栏进度指示器使用方法 Thread和Looper以及Handler和Message详解 Android开发必读 layout资源包含,android开发必读 Android本地化开发技巧 Android开发网将推出每天一类专题 ExifInterface使用,Android 2.0新增类 GraphableButton类实现Android UI开发 Android控件开发之ToggleButton原理 Android标题栏TitleBar全攻略 AsyncTask实例代码演示Android异步任务 重绘TextView类演示Android的Handler Android的SoundPool类使用与利弊 AsyncTask解决Android UI堵塞问题 Android自定义View实例AnalogClock源码 Android UI开发专题(五) Bitmap和Canvas实例 Android UI开发专题(四) View自绘控件 Android UI开发专题(三) 各种Drawable 提高Android开发效率-Eclipse快捷键大全 Android UI开发专题(二) 之绘图基础 Android UI开发专题(一) 之界面设计 Only the original thread that created a view hierarchy can touch its views的相关 Android上的Back键事件捕获 Android蓝牙API之BluetoothSocket类(2) Android蓝牙API之BluetoothSocket类 Android蓝牙API之BluetoothAdapter类(1) Android蓝牙API之BluetoothAdapter类(2) AndroidManifest.xml文件剖析 (三) AndroidManifest.xml文件剖析 (二) 我编了一个mousemove的过程为什么在onmousemove里看不到 jsp参数传递的乱马问题 校园网查看ip的问题 tuxedo分组很有学问,分不好会死,还有内存泄露,请赐教 有关页面调度的课程设计 新手问题,在线等! 内存大小是否会影响到网络速度? 谁来救我 ,SOS,求用C语言写的编译器 修改数据出错,不知为何? 等级考试的问题 请问能不能在不同用户登陆的情况来决定服务A是否启动。 关于还原精灵转储后win98不能启动的问题,请指教!~ 今天,我终于听到项目经理的一句内心话,让我们作为程序员感到一阵阵的寒心 请教一下 dll调试问题 怎样得到OnLButtonDown的point在整个屏幕上的坐标啊?谢谢 递归调用FindFirstFile、FindNextFile、FindClose的问题 页面调度有关的课程设计 关于client端与server端的连接问题 请问能不能在不同用户登陆的情况来决定服务A是否启动。 Textbox如何禁止它记忆以前曾经输入过的值? 我的XP的CPU经常占用90%以上,高手指点. 安装完win2000,又安装了天网防火墙,再安装SQL server 2000,快完成时启动服务警告“无法定位程序输入点” 急招深圳周边(含深圳).Net程序员 ??qustion Laney(6吨大肥猫) 快来啊^@^ 有关struts的<html:text>标签的问题!!!!!!!!!!!!!!!!!!!!!!! 为了考试挑灯夜读,遇到一个菜问题请大家帮忙! 哪位高手帮帮我!时间紧急! 关于还原精灵转储后win98不能启动的问题,请指教!~ 有几张漂亮图片,看看你的计算机是怎么累死的 求C++算法代码。 怎么实现在IE中将查找到的关键字用红色标记指示出来? 求C++算法代码。 请问哪里可以下载Numega DevPartenr Studio 测试工具 ㊣㊣ 什么也不多说了,帮忙给解决这个问题吧, 先多谢了!! ㊣㊣ 有个小小问题 寻找监测某端口的数据流量软件 都市幽灵·里面一定有宝藏 非常奇怪:为什么超链接无效? 显示异常 下个星期开始到新公司了,请大家给点经验,好吗 急!jsp+mysql,急寻blob输出方法!!! 修改记录问题 StringGrid的自画 导出 救命呀,关于XP的激活问题. 语句 请问有什么好的串口调试工具,可以模拟串口发送数据的??????? 简单问题高分相送 MessageBox.Show 方法需要什么样的名空间 忽然间明白过来适合什么成语? 英语翻译A data structure is a way to store and organize data in order to facilitate access and modifications.No single data structure works well for all purposes,and so it is important to know the strengths and limitations of several of them.这 高一数学题目..不会 ..求解1.已知U=R,A{X∈R|1<X<4} B={X∈R|X≤-1 或 X≥3},求CuA和CuB2.已知全集U={0,2,a的平方+2a+3} A={0,2} CuA={1,2},求a的值3.已知集合A={X∈R| 1≤X≤5} B={X∈R| a≤X≤2a+1} 且A≥B,求a的 心中忽然间明白了,是什么成语 为什么我单词3500都背会了但阅读还是老看不懂? 时光荏苒,怎么念 用成语代替全世界都知道 为什么背了单词还是看不懂文章单词尽管背了,可现在一做阅读发现单词还是看不懂啊,郁闷啊,只有90多天了,咋办 品读经典,完成下面的填空.1.《水浒》中的主要人物有:行者______,花和尚______,黑旋风______. 英语翻译内容是:"既然你开口叫我负责,我会负责到底的!" 单词背了就忘 阅读看不懂 愁死了 世界的统一性问题中,何谓一元论?何谓二元论?如题,要确切.重点是一元论与二元论. 实矩阵A特征值为r+is,有1/2(A+A')的特征值均为实数且为b1 在玉树地震时,电视新闻和报纸进行了大量的报道,谈谈最让你感动的一个画面,一个人或一件事 论述世界统一性原理是唯物一元论的前提和基础 谁能帮忙写篇作文啊悲观主义说,这个世界有无数的墙.乐观主义说,这个世界有无数的门.现实主义说,这个世界是由无数的隔膜和沟通的门组成的.你怎么理解这三种看法?请从上面三种看法中选 惆怅是什么意思 世界的统一性在于它的什么 谁能帮我写篇文章RT,主题是庆祝火锅店开业一周年.字数800左右. 惆怅的意思是什么?拜托了各位 谢谢 高一数学题 谢谢了诶~1.如果loga2>logb2>0,那么( )A.1 谁能帮我写篇作文啊?《爱点亮我的心灵》700字 一定是亲身经历的~ 请问一下惆怅是什么意思? 高一数学诶……泪流满面求指导做前三道就好了 我承认我问题很多==请给详细解释 谢谢 七年级下册地理的重点? 指出句子所运用的修辞手法:1.他正向古代典籍钻探,有如向地壳寻求宝藏 2.闻先生大无畏地在群众大会上,骂特务,慷慨淋漓,并指着这群败类说:你们站出来!你们站出来!阅读题:1.仰之弥高,越 《大道之行也》全篇课文的断句 您好,请问杭州离海宁有多远? 人情冷暖 世态炎凉 是什么意思 Mr Smith often helps the poor people.He is a man with a kind h_____________Mr Smith often helps the poor people.He is a man with a kind h_____________ 什么叫结构化程序设计?它的主要内容是什么? 翻译成英语 人情冷暖世态炎凉 “三皇五帝”中为何把炎帝划分在“三皇”里,而黄帝划分在“五帝”里在中国通史远古时期传说中,黄帝和炎帝同为有典氏的儿子,都是很杰出很有名望的部落酋长,为什么“三皇五帝”里把黄 英语为啥这么难? 世态炎凉鸡最懂,人情冷暖鸭先知. 三皇的“天皇”、“地皇”、“泰皇”,和“伏羲”、“神农”、“黄帝”.是一样的么?如题 为什么英语这么难 翻译 企业文化我们企业是以位置相关的各种信息的应用与发展,维持与改善人类生活作为企业发展方向和坚定不移的目标.把位置相关的信息领域所取得的成就做为我们衡量一起活动的标准. 三皇中的“黄帝”与五帝中的“黄帝”是否一样? 请问刘老师,行阶梯形矩阵是不是只能由行变换得到? 为什么英语回这么难 念天地之悠悠,独怆然而涕下.神木意思? 求问矩阵的初等行变换是否影响其对称性?并给出证明. 为什么英语对于我来说这么难? 翻译:念天地之悠悠,独怆然而涕下 已知矩阵B,求变换矩阵T使得(T的转置)*B*T成为对角矩阵,老师我想问一下先变行再变相应的列行不行? 世态炎凉人情冷暖世态炎凉.人情冷暖.为什么真么说 在经济繁荣时期和萧条时期因怎样分别运用财政政策? 几维的时空宇宙共有几维时空? (v-2s)/(2x-u)=(v-s)/s (u、v都是正数,且v+u≠0,求出s,并推导出1/s=(1/u)+(1/v) 如何提高学前教育经济效益 时间和空间的讨论,这是个几维的空间?假设题:地球发射宇宙飞船去A星探索星际环境,地球距离A星的空间直线距离假定为一光年.在飞船起飞的时候就与地面进行实时传播,地面开始录制整个飞 已知圆面C:(x-a)^2+y^2 怎么写学前教育专业学习情况? 一道初中语法题!麻烦详解.The teacher ,together with his students ,____ a trip to Nanjing.A have taken B are talkingC are going to take D is taking答案选的是D is taking C错在哪里?B呢? 重点论也是一元论,对吗, 这是科学,请学霸帮我,谢谢! 3点多少分时,时针和分针离2的距离相等,并且在2的两边 谁能帮我写篇文章 为什么在发达的资本主义国家美国马列主义著作有一定的市场 日本研发“织女”机器人助人感受与亲友美16岁少年因被没收手机心生不满将母黎巴嫩毒品走私严重 被指可能用于资助国际奥委会主席称赞索契为冬奥会准备工美国一男子被误判坐牢20余年后被释放法媒称索马里“青年党”一头目被美国无新加坡突查检查起重机安全 90家公司美气象学家发现预知高热天气方法 可提英国夫妇靠生孩子领社会福利 已生9名安倍访问土耳其 称日援建地铁象征日土美一父亲因将1岁幼儿独自留在家中遭到调查称法国火葬增加致扫墓鲜花减少影响分析称纽约需50亿美元修复因飓风毁坏莫斯科警方检查移民聚集区 约千人被送俄媒:叙已提供可用于生产化武1300泰国代孕黑市剥削孕母 酬劳低至5.8德国农场主检查马厩时发现自家马匹驮回俄圣彼得堡将遭强飓风袭击 涅瓦河水位阿富汗一男子被疑制造炸弹袭击事件 遭日本两男子涉嫌介绍未成年少女夜总会打日本一办公室里种大麻盈利逾千万日元 上汽大众正式公布PHIDEON中文名听说你是预言帝?那这笔钱你一定能拿走引爆中国经济的炸弹已经埋下...这三冻产有望重启油价关键月沙特伊朗对掐,绝对干货:信用卡新规8大变化和你息息上市系P2P平台幕后隐痛:光赚吆喝 干这个最赚钱!9大多金行业千万别错过降息背景下如何在安全边际获取最大收益拍拍贷一季度新增用户384万 可坐满3D建模助法国Iconem公司重建巴干这个最赚钱!9大多金行业千万别错过深圳统计公报姗姗来迟:泄露房价上涨最奥巴马宣布向叙利亚增兵250人打击I楼市价格周期将在几个月内见顶?社科院假如你是在美国做现在同样的工作,能挣乞丐月入47万?在迪拜上班是一种怎样中国2000年来最重要的改革来了:亿腾讯里,这个人每天赚75万!新浪这次把普通用户惹怒了!紧急!最好别把银行卡放裤兜里,很可能你还没有皈依佛门,可能是因为智商不够
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘