相关疑难解决方法(0)

何时何地获取Watch Complication的数据

在对并发症进行了几天的处理之后,我有信心对于以规定间隔发生的更新的更新过程进行以下说明:

  • 系统调用 requestedUpdateDidBegin()
    • 您可以在此处确定数据是否已更改.如果没有,您的应用程序不必做任何事情.如果您的数据已更改,则需要调用以下任一项:
      • reloadTimelineForComplication 如果您需要重置所有数据.
      • extendTimelineForComplication 如果您只需要在并发症时间轴的末尾添加新项目.
    • 注意:系统实际上可能会调用,requestedUpdateBudgetExhausted()而不是requestedUpdateDidBegin()如果您在当天花费了太多的并发症时间预算.这就是这个问题的原因.
  • 如果您打电话reloadTimelineForComplication,系统将调用getCurrentTimelineEntryForComplication(以及获取阵列的未来和过去变体,具体取决于您的时间旅行设置)
  • 这是猜想,因为我还没有测试它,但我相信如果你打电话extendTimelineForComplication说只会getTimelineEntriesForComplication(... afterDate date: NSDate ...)被调用.
  • 然后系统将调用,getNextRequestedUpdateDateWithHandler以便您指定复杂性需要新更新的时间.

Apple的文档非常明确,您不应该经常询问更新,或者在复杂化代码中进行太多处理,否则您将耗尽时间预算,并且您的并发症将停止更新.所以,我的问题是:你在何时何地进行更新?

对于上下文,我的方案是一个URL,其返回数据每小时最多更改两次.

放置URL获取代码最明显的地方是func requestedUpdateDidBegin()获取数据,存储它,如果没有变化,只需返回.如果有更改,则延长或重新加载时间线.

但是,URL提取可能会很昂贵.备择方案:

  • 将代码放在手机应用程序上并使用a发送WCSession,但如果用户关闭该应用程序,则更新将不再发生.
  • 使用推送更新,但这不是一个Web应用程序,所以我没有地方发送它们.
  • 显然,当用户与监视应用程序交互时,我将更新所有数据,但现在这意味着它只在用户使用应用程序时才会更新,从而无需复杂化.

还有其他地方吗?我可以在手表应用程序中使用不属于复杂功能的周期性功能吗?获取并发症更新数据的正确位置在哪里?

ios watchkit clockkit watchos-2 apple-watch-complication

29
推荐指数
1
解决办法
6674
查看次数

调用 ExtensionDelegate 为复杂功能创建/刷新数据

我所有的数据创建都是在ExtensionDelegate.swift.

问题ExtensionDelegate.swift没有得到该功能之前叫getCurrentTimelineEntryForComplication我的ComplicationController.swift

有任何想法吗? 这是我的代码和详细信息:

所以我的数组extEvnts是空的ComplicationController.swift

    func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) {

        let extEvnts = ExtensionDelegate.evnts
}
Run Code Online (Sandbox Code Playgroud)

因为 myExtensionDelegate.swift还没有被调用,这就是为数组创建数据的原因:

class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate {

    private let session = WCSession.defaultSession()
    var receivedData = Array<Dictionary<String, String>>()
    static var evnts = [Evnt]()

    func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) {

        if let tColorValue = userInfo["TeamColor"] as? String, let matchValue = userInfo["Matchup"] as? String { …
Run Code Online (Sandbox Code Playgroud)

ios swift watchkit watchos-2 apple-watch-complication

5
推荐指数
1
解决办法
1850
查看次数

WKWatchConnectivityRefreshBackgroundTask永远不会在后台触发,但是WKSnapshotRefreshBackgroundTask

我想用iPhone在后台更新我的手表应用程序状态 session.updateApplicationContext(applicationContext).

在手表上的应用程序处于活动状态时发送应用程序联系人可以正常工作.
当我激活手表上的主页按钮时,手表应用程序会进入后台,handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)被呼叫并WKSnapshotRefreshBackgroundTask提供一个.

所以我不明白为什么a WKSnapshotRefreshBackgroundTask被正确触发,但不是a WKWatchConnectivityRefreshBackgroundTask.

Apple的文档说:" 当您从配对的iPhone接收后台数据时,系统会在后台启动您的应用程序,实例化一个WKWatchConnectivityRefreshBackgroundTask对象,并将任务对象传递给您的扩展委托的handleBackgroundTasks:方法.".

但这不会发生在设备上,也不会发生在模拟器上.可能有什么不对?

编辑:

为了检查可能出错的地方,我下载了Apple的演示项目"QuickSwitch",可在此处下载.以下是应该处理后台任务的代码:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for backgroundTask in backgroundTasks {
        if let wcBackgroundTask = backgroundTask as? WKWatchConnectivityRefreshBackgroundTask {
            // store a reference to the task objects as we might have to wait to complete them
            self.wcBackgroundTasks.append(wcBackgroundTask)
        } else {
            // immediately complete all other task types as we have not added support for them …
Run Code Online (Sandbox Code Playgroud)

background-task watchconnectivity watchos-3

2
推荐指数
1
解决办法
1931
查看次数