WatchOS5-如何立即刷新并发症?

时间:2018-11-18 20:00:18

标签: ios12 apple-watch-complication watch-os-5

我有一个苹果手表并发症,一个iPhone应用程序并排运行。我在应用程序中有一个按钮,可以将应用程序上下文字典传输到手表。我希望看到并发症标题能够刷新。

我似乎无法强迫“点击按钮->查看并发症的更新”这种行为。

什么是强制更新并发症的合适方法?如何立即刷新Apple Watch的并发症?

我确实看到标题发生了变化,但是我认为这需要我点击复杂性才能首先打开它的Apple Watch应用程序。如何获得并发症以在Watch主屏幕上进行自我更新?

func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {

if complication.family == .graphicRectangular {
  let template = CLKComplicationTemplateGraphicRectangularLargeImage() 
//...configure
  return template
  }
}

我看到这个苹果提供的代码可以刷新并发症。我不确定是否太多,或者如果我要使用上面的条目生成复杂性,仅调用extendTimeline就足够了。

func refreshComplication() {
      #if os(watchOS)
    let server = CLKComplicationServer.sharedInstance()
    if let complications = server.activeComplications {
        for complication in complications {
            // Call this method sparingly. If your existing complication data is still valid,
            // consider calling the extendTimeline(for:) method instead.
            server.reloadTimeline(for: complication)
        }
    }
    #endif
}

1 个答案:

答案 0 :(得分:3)

您应该可以通过在具有 WCSessionDelegate 的文件中的refreshComplication()块中调用didReceiveApplicationContext函数来做到这一点。

因此,如果您是通过applicationContext消息接收标题的,那么您的代码将与这些内容相似。

func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {

    if let updatedTitle = applicationContext["updatedTitle"] {
        if let title = updateTitle as? String {
            //Remeber that complicationServer.swift is a seperate process therefore you will need to store the received data somehow.
            UserDefaults.standard.set(title, forKey: "complicationTitle")
            refreshComplication()
        }
    }
}

我的iOS应用程序中有一个设置,允许用户更改目标,并使用此方法几乎立即刷新了具有新目标的并发症。但是,我相信一旦您的复杂性用完了它的CPU预算,什么都不会发生,但希望那对您而言不会发生。参见https://developer.apple.com/documentation/clockkit/clkcomplicationserver/1627891-reloadtimeline

希望有帮助,请告诉我您的情况。 提请