转载

微软前员工:开发Apple Watch应用的27个技巧

微软前员工:开发Apple Watch应用的27个技巧

英文原文: WatchKit Development Tips

自一月中旬以来,我就全身心投入到 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 通讯框架,你会有所启发。

微软前员工:开发Apple Watch应用的27个技巧

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 应用更重要)。

正文到此结束
Loading...