阅读更多
曾在微软工作12年的Mike Swanson从1月开始就一直在捣鼓开发Apple Watch应用,在此开发过程中,他总结了诸多WatchKit的开发建议与技巧,并将其整理成文,希望对Apple Watch应用开发者们能够有所启发。
自一月中旬以来,我就全身心投入到WhereNotes应用的Apple Watch版本的开发上了,并幸运地受邀参加了库比蒂诺苹果总部的Apple Watch实验室测试。在过去的三个半月里,我整理了诸多WatchKit的开发建议和技巧,并将重点内容列在这里,希望对Apple Watch应用开发者有所启发。



1. WatchKit的NSExtensionContext通知

可能对诸多开发者来说,UIApplication上的函数方法并不陌生,比如applicationWillEnterForeground:和applicationDidEnterBackground:,两者都是先被调用,再分别发出UIApplicationWillEnterForegroundNotification和UIApplicationDidEnterBackgroundNotification的通知。而WatchKit的 NSExtensionContext通知则包括:
  • NSExtensionHostWillEnterForegroundNotification
  • NSExtensionHostDidEnterBackgroundNotification
  • NSExtensionHostWillResignActiveNotification
  • NSExtensionHostDidBecomeActiveNotification

2. 充电测试更有效

在Apple Watch充电时进行测试,测试过程更容易,结果也更可靠,这一点不仅仅是我,其他Apple开发者论坛上的同行也深有体会。

3. WatchKit只能在当前活动/可见的视图控制器上更新

在iOS上几乎可以随时更新界面元素,但WatchKit只能在当前活动/可见的视图控制器上更新。只要didDeactivate还没有调用,就能顺利完成更新(注意:界面元素不能用didDeactivate更新)。这也就意味着:开发者想 要更新一个当前隐藏起来的视图控制器(比如查看一个模态控制器“on top”),就必须用当前控制器的willActive方法来更新,而willActive只有在取消(dismiss)模态控制器时才能被调用。

4. addCachedImage:name缺省使用PNG编码

除了WatchKit应用捆绑包里的资源,每个应用还享有5MB容量的图片缓存空间,用WKInterfaceDevice上的方法来放置扩展,并用扩展进行管理。从扩展向Watch发送图片会消耗时间和电量,所以如果要再次使用某张图片(即使只用过一次),最好将它缓存起来;如果用addCachedImage:name:来发送图片,它会自动以PNG格式缓存起来(也许PNG格式并不是最合适的,但至少是最保险的)。如果图片能以JPG格式再次呈现的话,那么建议改用addCachedImageWithData:name: 来发送。以JPG格式储存图片后再试试画面设置,图片转换不仅更快,还省下了不少缓存空间,方便储存更多图片。

5. 支持后台线程缓存图像

依然跟上一条建议相关:开发者可以在后台线程上缓存图片(开发者论坛的一名苹果员工如是说)。我在开发Watch应用时尝试了一下,图片在读取之前就缓存好了。

6. 开发者需自行封装图片管理器

要使用上述的图片缓存的话,并无内置的方法来检测最早的图片。若应用同时管理很多图片,可能需要在缓存里设立一个单独的管理器。

7. 测试通知功能时记得关闭手腕感应

在Apple Watch上测试通知功能时,需要在其Companion(伙伴)应用的通用设置里关掉Wrist Detection(手腕感应)。

8. 若要强制退出应用,长按侧键打开Friends应用

要强制退出应用,就单击侧键打开Friends应用,然后再按一次(注意,强制退出应用不代表强制退出扩展)。

9. 尽可能地精简willActivate操作,缩短加载时间。

10. 先Watch后iPhone App

如果用户在你的iPhone应用之前抢先发布Watch App就不妙了,所以留点心,别让苹果的应用审核快你一步发现问题。

11. 切忌处理大图片

Watch应用是以扩展的形式运行的,其本身内存相比iPhone应用更受限制,所以像是稍大点的图片,还是留给iPhone应用处理就好(用openParentApplication:reply:)。还要注意,模拟器不受内存限制,所以最好还是在真机环境中进行测试。

12. 通过共享NSUserDefaults设置布尔值检测匹配

要测试应用是否跟Watch匹配,可以在共享应用组中通过共享NSUserDefaults设置一个布尔值来进行检测。

13. 实现iPhone与Apple Watch的数据同步

要想实现iPhone和Watch的数据同步,要么用openParentApplication:reply:来让iPhone应用执行所有数据更新,要么使用Darwin notifications在扩展和iPhone应用之间发送事件。Darwin notifications不支持数据负载,如果想用通知来传送数据的话,可以看一看 MMWormhole通讯框架,你会有所启发。



14. 定时器刷新界面元素

可以用定时器(或在willActive里)更新和刷新界面元素。当然,在数据源支持的情况下也可以用KVO。我在开发Watch应用时运用了KVO,用这个方法,元素只有在产生变化时才更新,这样能节省传输负载和电量。

15. awakeWithContext传self指针很有用

若要追踪视图控制器,可以考虑用awakeWithContext来传递self指针。

16. when-in-use

WatchKit扩展是前台扩展(foreground extension),所以在用到Core Location许可时,只需发送一个when-in-use(使用时)认证请求就好。

17. 少用“实时更新”
除非万不得已,否则不要使用”实时更新(live update)“,使iPhone和Watch即刻同步。用户一般不会同时使用两个设备,所以在iPhone或Watch启动时更新数据,足以避免诸多混乱的同步逻辑。可惜,一看到并列的模拟器屏幕就想设立复杂的同步逻辑,我就干过这样的事儿。

18. 用hide/unhide代码构建动态视图界面

虽然无法用程序建立和管理界面控制器,但hide/unhide元素还是尽在掌控的。举个例子,WatchKit最常见的操作之一就是构建一个可以显示所有信息的页面。或者在编程中,如果要在两个布局中选其一,那么可将其安放在top-level group里,仅在必要时显示或隐藏。

19. 每次屏幕点击和界面更新都需要Watch与iPhone的往返通信,在编程时要考虑到这一点。

20. 记录值决定再次写入更新

由于WatchKit界面元素的“只写”特性(只能设定函数),开发者不需要二次设定追踪记录的值,而WatchKit还能对值进行合并,只在运行循环交接时发送最终值,但亦可自行追踪。

21. 无内置的进度指示器

Watch并没有内置的进度指示器控件,但系列动画图像的显示和持续的图片转换下载依然能同时进行。操作结束时,直接隐藏进度指示器图片即可。在此,大家可以尝试一下我刚刚在GitHub上更新的 JBWatchActivityIndicator,它能让创建活动指示器图片序列变得更简单,预先渲染的类苹果序列也包含在内。

22. 一定要充分利用Apple Watch Design Resources

开发Apple Watch应用,一定要下载 Apple Watch Design Resources并认真阅读,里面除了颜色和尺寸建议外,优质的边框图片还可以截下来给应用打广告。说到这里注意一下:提交的应用截图是不能带边框的。

23. 解决真机图片显示异常问题

图片在模拟器里显示正常,但在真正的Watch上却出了问题,让开发者们叫苦不迭,实际上这也是诸多应用被拒的根本原因。问题就出在文件命名和”零散“的图片文件上,而最保险的办法就是在Watch 应用(非扩展)的target里建个assets来存储所有图像。

24. 使用Handoff让iPhone应用前台启动

目前,还没有明确的办法可以直接通过Watch前台启动iPhone应用(虽然可以在模拟器上实现),所以,还是考虑使用苹果的Handoff来代替吧。

25. 控制器间使用NSNotifications通信

在视图控制器之间的通信最好别用awakeWithContext:,发送NSNotifications好一些,在扩展里运行更流畅。也可以看看我开源的WKInterfaceController子类 JBInterfaceController,使用委托模式。

26. 本地通知需要设置soundName属性来触发Tapic反馈和提示音。

27. 真机测试很重要!

从模拟器入手是挺好,但是在真机环境中测试自己的Watch应用才是最关键的一步(甚至比测试iPhone或iPad应用更重要)。
  • 大小: 166.3 KB
  • 大小: 24.2 KB
2
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 揭秘苹果应用审核团队(史上最全版)

    ????????关注后回复“进群”,拉你进程序员交流群????????一、前言大家好!又到了我们的吃瓜时刻啦, 准备好小板凳哈~最近,Epic Games vs Apple 的诉讼大战...

  • 移动终端安全 顶级会议_顶级移动应用开发公司

    服务项目:产品策略,原型和概念开发,产品设计,iOS应用开发,Android应用开发,Web应用开发,Bot和会话界面开发,交互式电视开发,Xamarin开发,SAP开发,质量保证和测试,移动后端工程,安全与合规性,应用分析...

  • 劳拉·申克(Lara Schenck),WordPress开发,自由职业和休假

    他们讨论了以自由职业者为生,生产力以及拖延,建立网络和答复电子邮件的技巧,自我教学和获得经验,使用隐喻来解释事物,了解客户的真正需求,请假,节省金钱以及逐步养育婴儿的技巧。 。 Visit the Versioning ...

  • 学习iOS开发必看的一些资料

    此文档是Apple平台开发所使用语言的主流学习资源,后续如有好资源,博主还会继续更新。未完待续~~~ ,也欢迎大家在评论区中分享自己的学习资源。。。

  • 谷歌原数据保护团队技术主管:零信任实践分享

    在此背景下开发的Binary Authorization for Borg(BAB) 系统已经在谷歌生产环境中实现了全面覆盖:任何人在生产环境中以任何服务的身份运行任何软件包之前,都必须为目标服务建立一个足够强的BAB安全策略。...

  • 《偶像爱豆出身的编程语言排行第一得主!谁还敢嘲python没实力?》Python应用与实践

    可能有些标题党,没有针对某些具体的应用与实践。有哪些补充、不足请大家指出。 Python是什么? Life is short, You need python 生命苦短,我用Python 1.1. Python语言 Python是一种解释型、面向对象、动态数据...

  • 2021-09-20

    苹果挑战了许多公司,IBM,微软,甲骨文,华为,三星,YOUTUBE,SONY……但没有一家公司能单独挑战苹果。苹果公司已经接近于无敌境界。 大家津津乐道苹果一流的产品体验,卓越的生态系统,出色的品牌营销能力……, ...

  • 学习资料收集

    iOS开发者博客,您可以: 使用iOSBlogCN添加或者订阅 从社区学习知识 iOS技术周报 ...MAC开发环境配置 什么是Swift,如何评价 Swift 语言? 了解一下Objective-C是什么 iOS开发60分钟入门 ...

  • 文章目录(三周年)

    2020年5月71905.1412个前端必会 H5 问题及解决方法718 05.13 前端缓存最佳实践71705.12深圳腾讯前端面经分享2020年3月71603...

  • 国外测试牛人博客

    说起软件开发界的牛人,大部分从业人员都可以列出很多,但测试界的大牛为人所知的却很少,其实并不是测试界没有牛人,而是很少有关于这些牛人的介绍。今天我就整理一篇,让测试界的牛人出来露个脸,捎上牛人的博客,...

  • git/github的使用

    内容最后更新时间:2018-08-10 ...当开发中遇到困难或者职业技能遇到瓶颈时,Github简直是相见恨晚的利器,身为一线开发者,如果没有接触过Github,的确是一大损失。因此,从今天开始,本课程就...

  • [转]信息安全相关理论题(四)

    26、____表示邮件...27、买家称购买商品异常后的正确操作是立即咨询官方客服。 A、 正确 B、 错误 您的答案: 标准答案: A 28、网上陌生人给你发送补丁文件正确的操作是不下载文件。 A、 错误 B、 正确 您的答...

  • git/github的使用(入门到中阶)

    内容最后更新时间:2017-08-10 以下内容是我在收集而来,再经过自己的经验修改而成,希望对你有用(在不断的更新中) 博客地址 欢迎来到Github 初识Github ...当开发中遇到困难或者职业技能遇到瓶颈时,Gi...

  • 16 步,打造市值 11 亿美元的 SaaS 公司

    16 步,打造市值 11 亿美元的 SaaS 公司1. 以客户需求为中心2. 登门拜访前 100 家客户(以及天使... 开发一个以指标为导向的 Outbound 流程9. 窃取竞对的流量10. 建立自己的媒体品牌11. 购买产品以获取对方反向链接...

  • git/github使用(入门到中阶)

    内容最后更新时间:2018-01-01 以下内容是我在收集而来,再经过自己的经验修改而成,希望对你有用(在不断的更新中) ...当开发中遇到困难或者职业技能遇到瓶颈时,Github简直是相见恨晚的利器,身为一线开发者,...

  • Kubernetes 的5周年成绩显赫、Java之父James Gosling的履历等;开源之道每周评论(2019 09 17)...

    沟通,人类协作的第一要务,但是人与人之间的沟通却在不断的加深,在对于企业管理、社区建设、个人修养、家庭幸福方面都是至关重要的能力和技巧,这方面的培养应该重视起来,就像这个社会不仅仅只有技艺,即过分强调...

  • dnSpy-net-win32-222.zip

    dnSpy-net-win32-222.zip

  • 和美乡村城乡融合发展数字化解决方案.docx

    和美乡村城乡融合发展数字化解决方案.docx

Global site tag (gtag.js) - Google Analytics