您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
微软前员工:开发Apple Watch应用的27个技巧
 
作者:Mike Swanson 来源:Mike Swanson's Blog 发布于: 2015-05-08
   次浏览      
 

摘要:曾在微软工作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应用更重要)。

       
    次浏览       
     
    相关文章

    手机软件测试用例设计实践
    手机客户端UI测试分析
    iPhone消息推送机制实现与探讨
    Android手机开发(一)
     
    相关文档

    Android_UI官方设计教程
    手机开发平台介绍
    android拍照及上传功能
    Android讲义智能手机开发
    相关课程

    Android高级移动应用程序
    Android系统开发
    Android应用开发
    手机软件测试
    最新活动计划
    Node+Vue3.0前端全栈开发 7-5 [特惠]
    Spring Cloud微服务架构 7-5[特惠]
    SysML和EA系统设计与建模 7-26[特惠]
    Python、数据分析与机器学习 8-23[特惠]
    嵌入式软件架构设计 8-22[线上]
    Linux内核编程及设备驱动 7-25[北京]

    android人机界面指南
    Android手机开发(一)
    Android手机开发(二)
    Android手机开发(三)
    Android手机开发(四)
    iPhone消息推送机制实现探讨
    手机软件测试用例设计实践
    手机客户端UI测试分析
    手机软件自动化测试研究报告
    更多...   


    Android高级移动应用程序
    Android应用开发
    Android系统开发
    手机软件测试
    嵌入式软件测试
    Android软、硬、云整合


    领先IT公司 android开发平台最佳实践
    北京 Android开发技术进阶
    某新能源领域企业 Android开发技术
    某航天公司 Android、IOS应用软件开发
    阿尔卡特 Linux内核驱动
    艾默生 嵌入式软件架构设计
    西门子 嵌入式架构设计
    更多...