IOS开发:WatchKit的应用程序要点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS开发:WatchKit的应用程序要点相关的知识,希望对你有一定的参考价值。

参考技术A   WatchKit
应用程序架构
  WatchKit
应用程序是一个运行在
Apple
Watch
中的可执行文件。它包括
storyboard
和渲染屏幕时所需的资源文件。
  WatchKit
扩展则是运行在
iPhone
上的可执行文件。包括管理应用程序界面的逻辑代码,以及处理用户的交互操作。
  为了程序界面的正常使用,这两部分需要一起运行。用户与应用程序交互的典型步骤如下:
  用户与
WatchKit
应用程序交互。
  WatchKit
应用程序分析交互情况,并选择将被管理的
storyboard。
  WatchKit

iPhone
通讯,以运行
WatchKit
扩展。
  WatchKit
扩展初始化并创建需要提供给
WatchKit
应用程序
storyboard
使用的对象。
  Storyboard
根据
WatchKit
扩展创建的对象,生成
scene,并将其显示到
Apple
Watch
中。
  WatchKit
应用程序和
WatchKit
将会共享一些信息,直到用户停止使用
WatchKit
应用程序。此时,ios
将使
WatchKit
扩展休眠,直到有新的用户交互。
  下面的这个图演示了这个流程:
  上图中有个重要的概念就是
storyboard
响应用户的操作并配置需要显示的屏幕内容的方法。这归功于
interface
controller对象
(WKInterfaceController的实例),相当于
iOS
中的
view
controller。
  与
view
controller
不同的是
interface
controller
不管理屏幕中实际的
view,WatchKit
以透明的方式对
view
进行处理。一般,一个
WatchKit
应用程序会有多个
interface
controller,用来显示不同的数据类型,只不过同时只显示一个罢了。
  WatchKit
应用程序的生命周期
  一个
WatchKit
应用程序的启动方式有
3
种:
  用户点击
Apple
Watch
主屏幕上的图标。
  用户与应用程序的
glance
交互。
  用户与通知交互。
  上面的每种方式都将初始化
WatchKit
应用程序和
WatchKit
扩展。根据上面不同的启动方式,WatchKit
会利用相应的
storyboard
加载
scene,并请求
WatchKit
扩展初始化相应的
interface
controller。
  下面的图演示了相关过程:
  如图所示,在用户界面中,interface
controller
对象管理着相关交互。当用户与
Apple
Watch
上的应用程序交互时,WatchKit
扩展会运行。一旦用户停止交互或者从程序中退出,iOS
将关闭当前的
interface
controller,并休眠扩展。在用户和
Apple
Watch
之间,这样的交互方式非常简洁,interface
controller
应该是轻量级的,并且快速的执行任务。
  下面的图演示了相关过程:

在 WatchKit 应用未运行时从 iOS 应用设置 WatchKit 应用的值

【中文标题】在 WatchKit 应用未运行时从 iOS 应用设置 WatchKit 应用的值【英文标题】:Setting a value for WatchKit app from iOS app when WatchKit app isn't running 【发布时间】:2016-08-19 08:17:42 【问题描述】:

我已经知道如何使用 WCSession 的 updateApplicationContext 方法,但它只在我的 WatchKit 应用程序运行时有效。

我需要将货币汇率从 iOS 应用程序传输到手表,以更新我的手表数据和复杂功能。

我有一个 API 可以获取 USD-CNY 和 USD-EUR 的汇率,并希望与手表共享(类似于 NSUserDefaults 保存数据的方式),因此它可以显示“1 USD = 6.3人民币”在我的并发症中。

那么,我该怎么做呢?

【问题讨论】:

【参考方案1】:

对于 watchOS 2

只有一种WCSession 方法可以让您在手表应用未激活时更新您的并发症数据。

假设您的并发症处于活动状态,并且您没有超过the (iOS 10) number of transfers per day,transferCurrentComplicationUserInfo 将在后台唤醒您的手表扩展,并立即将用户信息传输到您的扩展。

然后,您的扩展程序可以将这些数据保存在手表上(供手表应用在激活时使用),更新您的复杂功能之前。

func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) 
    if let ...  // Retrieve exchange rate data from dictionary
        // Add code here to update your cache/backing store with exchange rate
        // ...

        // Now update the complication
        let complicationServer = CLKComplicationServer.sharedInstance()
        guard let activeComplications = complicationServer.activeComplications else  // watchOS 2.2
            return
        

        for complication in activeComplications 
            complicationServer.reloadTimelineForComplication(complication)
        
    

对于 watchOS 3

watchOS 3 支持后台刷新应用任务。这意味着您的手表应用现在可以在后台更新自身、停靠快照和复杂功能。

我已经covered this information in an existing answer,但将在这里总结关键要点:

Apple 建议您利用所获得的每个机会,无论您的应用是在前台还是在后台,以使您的复杂功能、应用和停靠快照保持最新。

这是一个根本性的变化,从仅在应用未激活时更新复杂功能,到现在更新所有内容 -- 复杂功能、应用和停靠快照 -- 不管你的手表应用是在前台还是后台。

关于更新频繁更改数据的限制说明

无论您使用哪种方法,请记住,您每天或每小时可以执行的更新数量将是 limited。

按照 Apple 的建议,您应该考虑将汇率更新安排在需要的时间。这两个课程涵盖了何时(以及如何)更新您的手表应用:

804 Designing Great Apple Watch Experiences 讨论何时以及为何更新您的手表应用。

218 Keeping Your Watch App Up to Date 提供有关使用后台任务更新复杂功能、应用程序和停靠快照的详细信息。

【讨论】:

感谢您的回答,但如果不运行 WatchKit,则无法调用“func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])”。而且我肯定没有赶上并发症的每日限制,我现在仍然无法解决我的问题。 您需要activate the session in the extension delegate's init method。这将允许扩展程序接收用户信息,即使手表应用程序未运行。

以上是关于IOS开发:WatchKit的应用程序要点的主要内容,如果未能解决你的问题,请参考以下文章

watchkit 应用程序的企业配置?

从 iOS 打开 WatchKit 应用程序

如何下载 WatchKit? [关闭]

如何在 WatchKit 应用中获取当前位置?

为啥从 WatchKit 扩展向 iOS 发送消息并得到回复如此缓慢?

WatchKit 核心数据同步