当前位置: 首页 > 科技观察

iOS开发者注意事项:WatchKit开发技巧

时间:2023-03-13 02:38:10 科技观察

自1月中旬以来,我一直致力于WhereNotes应用程序的AppleWatch部分。我也有幸被邀请到库比蒂诺的AppleWatch实验室。在过去的三个半月里,我收集了很多技巧并在这篇文章中涵盖了其中的大部分。希望这些技巧对您的AppleWatch开发有所帮助。也许您熟悉applicationWillEnterForeground:和applicationDidEnterBackground:等方法。它们在相应的通知(UIApplicationWillEnterForegroundNotification和UIApplicationDidEnterBackgroundNotification)之前被调用。等效的(鲜为人知的)WatchKitNSExtensionContext通知如下所示:界面元素在iOS上可以随时更新,但在WatchKit上,只能更新当前活动的可见视图控制器中的元素。在调用didDeactivate方法之前,无法安全地执行更新。(注意你不能在这个方法中更新界面元素)这意味着如果你打算更新一个当前隐藏的视图控制器(例如,你正在查看最顶层的模态控制器),你将需要执行当前控制器的willActivate方法,这当模态控制器消失时将调用方法。除了Watch应用程序包中包含的资产外,每个应用程序只允许有5MB的高速图像缓存。图像缓存是使用WKInterfaceDevice中的方法通过扩展导入和管理的。从扩展程序向手表发送图片需要时间和电池电量,因此您需要重复使用图片(即使只使用一次),值得缓存。如果使用addCachedImage:name:发送图片,图片将自动编码为PNG格式并发送到缓存。PNG是否是最佳格式(但它是最安全的)。如果你的图片可以渲染成JPG格式,我强烈推荐使用addCachedImageWithData:name:代替上面的方法。将图片编码为JPG格式,尝试图片质量设置,不仅图片传输速度更快,而且你的缓存空间也更大,可以存储更多图片。如前所述,您可以在后台进程中缓存图像(根据开发者社区中的一位Apple员工的说法)。我在我的Watch应用程序中使用了提前缓存图像的技术。如果您使用前面提到的图像缓存,则没有内置的方法来决定删除最早使用的图像。如果您的应用程序管理许多图像,您将需要包装缓存管理器。要在AppleWatch上测试通知,请在与AppleWatch配对的应用程序的常规设置中关闭手腕检测。要强制退出该应用程序,请按住它旁边的按钮,然后在一段时间后再次按住它(请注意,强制退出您的应用程序不会强制退出您的扩展程序)。尽量减少willActivate中的处理工作,减少加载等待时间。考虑用户在使用iPhone应用程序和设计一致性之前打开您的Watch应用程序。应用审查会发现这些情况。请记住,您的Watch应用程序作为扩展程序运行。你的Watch应用比你的iPhone应用有更严格的内存限制。如果您要处理大量图像,最好在iPhone应用程序中执行此操作(使用openParentApplication:reply:)。另请注意,模拟器不会强制执行这些内存限制,因此必须在真实设备上进行测试。要确定您的应用程序是否与Watch兼容,请为Watch应用程序的共享NSUserDefaults设置一个布尔值(使用共享应用程序组),以便您的iPhone应用程序可以获取它。要在iPhone和Watch之间同步数据,您可以调用您的iPhone应用程序来执行所有数据更新(使用openParentApplication:reply:),或使用Darwin通知在扩展程序和iPhone应用程序之间发送事件。Darwinnotifications不支持数据加载,所以如果你想通过notifications传输数据,请查看非常有用的MMWormhole项目。除了使用定时器来更新和刷新界面元素外,如果您的数据源支持,您还可以使用KVO。这是我在Watch应用程序中使用的方法。使用这种方法,界面元素仅在它们发生变化时更新,从而减少通信消耗并节省电池电量。如果您需要跟踪控制器接口,请考虑在awakeWithContext:中传递对self的引用以建立关系。我通过我的JBInterfaceController子类在我的应用程序中大量使用了这种模式。使用这样的技术可以让您像使用代理模式一样工作。另外,将您的控制器更像是UIViewController。WatchKit扩展是前台扩展,所以如果需要CoreLocation的授权权限,只需要在需要的时候请求授权即可。除非你的场景需要,否则你必须仔细考虑是否需要“实时更新”,即Watch和iPhone之间的即时同步。用户通常不会同时使用两台设备,因此只需在下次激活Watch或iPhone应用程序时更新数据即可避免大量同步逻辑。不幸的是,看着彼此相邻的手表和iPhone模拟器的屏幕,很有可能构建复杂的同步逻辑。也许我知道了,但我没有告诉你。当您无法以编程方式创建和控制视图控制器时,您最好了解如何隐藏和显示视图元素。这将是一种常见的WatchKit做法,例如,创建一个完整的页面标签,如果有重要消息要显示,则可以显示该标签。或者,如果您有两个需要以编程方式选择的布局,您可以将它们包含在最上面的组中,并根据需要隐藏和显示它们。请记住,每次屏幕触摸和界面更新都需要在Watch和iPhone之间来回切换。WatchKit界面元素是只写的(它们通常也有setter方法),这需要在你已经设置它们之后手动跟踪你不想再次设置的值。WatchKit尝试在每个运行循环中合并值并且只发送最后一个值,但你也可以参与跟踪你自己的值。虽然没有内置的活动指示器控件,但您可以在执行较长的过程(例如图像传输或下载)时显示一系列动态图像。2015年5月3日更新:我刚刚在GitHub上发布了JBWatchActivityIndi??cator项目,这使得创建活动指示器图像序列变得更加容易。它还包含一些Apple风格的预渲染序列。请务必下载并查看AppleWatch设计资源。除了有用的颜色和尺寸建议外,还包括用于市场截图的高质量图像。当我谈到这个话题时,您提交不包含边框图像的应用程序屏幕截图毫无价值。许多开发人员对图形在模拟器上显示正确,但在真实手表上显示不一致表示失望。事实上,这就是许多应用程序被拒绝的原因。文件命名和丢失文件时会出现此问题。最安全的解决方案是将所有图像包含在Watch应用程序(而不是扩展程序)的资产库中。这就是我在Watch应用程序中所做的。我建议您使用相同的方法。虽然能够将你的iPhone应用程序从Watch加载到前台是一个非常普遍的要求,但它无法通过编程来实现(即使有办法在模拟器上运行它),请考虑使用Handoff。如果您需要在两个视图控制器之间传递信息,但您不能使用awakeWithContext:来完成,请考虑改为发送NSNotifications。在扩展中,它们工作正常。否则远程指定克隆我的JBInterfaceController子类,并使用代理模式。本地通知需要设置soundName属性以生成触觉反馈和铃声。模拟器是一个好的开始,但在真实硬件上测试您的应用程序是关键。