标签: wkrefreshbackgroundtask

使用Swift 3和后台任务更新复杂性

对于watchOS 3,Apple建议使用WKRefreshBackgroundTask而不是使用更新复杂功能getNextRequestedUpdateDate.

如何使用新方法确定两次更新之间的时间?

我只会破解我的数据请求(从网址)进入getCurrentTimelineEntry并将更新复杂功能,但我认为这不是苹果推荐的.

一个简短的代码示例将是一个很大的帮助.

swift apple-watch-complication swift3 watchos-3 wkrefreshbackgroundtask

8
推荐指数
1
解决办法
3703
查看次数

尝试在watchOS中进行后台刷新时,不会调用WKURLSessionRefreshBackgroundTask

我正在研究从Web服务获取计划数据的复杂性.每20-30分钟(或手动),我正在安排WKRefreshBackgroundTask来执行此操作.

正如Apple所建议的那样,我希望操作系统能够通过后台处理这些数据NSURLSession.

这是我用来下载我需要的数据的功能:

func scheduleURLSession()
{
    print("\nScheduling URL Session...")

    let backgroundSessionConfig:URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString)
    backgroundSessionConfig.sessionSendsLaunchEvents = true

    let backgroundSession = URLSession(configuration: backgroundSessionConfig)

    let downloadTask = backgroundSession.downloadTask(with: URL(string: "https://www.myserver.com/somedata")!)
    downloadTask.resume()
}
Run Code Online (Sandbox Code Playgroud)

关于这个的一些事情:

  1. 它在我安排时会被调用.我在控制台中看到了它的print语句.
  2. 它与Apple的例子几乎完全相同.
  3. 我省略了这个网址.同样的URL在iOS/watchOS应用程序中工作得很好,所以没有任何问题.

问题是,即使我正在调用resume()该任务并允许它在完成时唤醒我的应用程序,它似乎也没有.

完成后,它应该回到WKExtensionDelegate处理程序:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)
Run Code Online (Sandbox Code Playgroud)

作为一个WKURLSessionRefreshBackgroundTask,但它没有.

我的代码与Apple的示例代码相同,然后创建另一个会话,但通过WKURLSessionRefreshBackgroundTask标识符重新加入它.这是设置委托以处理下载数据的位置.检查代码:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task in backgroundTasks {
        switch task {

        case let backgroundTask as WKApplicationRefreshBackgroundTask:
            print("\nWatchKit - WKApplicationRefreshBackgroundTask")
            // self.updateComplicationDataArrivalTimes(backgroundTask)
            self.scheduleURLSession()
            backgroundTask.setTaskCompleted()

        case let snapshotTask as WKSnapshotRefreshBackgroundTask: …
Run Code Online (Sandbox Code Playgroud)

nsurlsession watchkit watchos watchos-3 wkrefreshbackgroundtask

7
推荐指数
2
解决办法
2017
查看次数

reloadTimeline()不会更新复杂性

我正在尝试制作一个watchOS 3应用程序,我想在后台任务中更新我的复杂功能.

首先,我从后台任务中的服务器获取新数据handle().在那之后,我通过电话更新我的主动并发症complicationServer.reloadTimeline(for:).

在控制台中,我看到消息"更新复制",因此代码被执行.

然而,重新加载后,并发症显示旧数据.如果我切换表盘并切换回来,那么复杂功能有时会重新加载.我是否必须做其他事情才能从后台任务重新加载复杂功能?

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task : WKRefreshBackgroundTask in backgroundTasks {
        if (WKExtension.shared().applicationState == .background) {
            if task is WKApplicationRefreshBackgroundTask {
                let dataProvider = DataProvider()
                dataProvider.getData(station: "Name", completion: { (data, error) in
                    self.updateComplication()
                    self.scheduleNextBackgroundRefresh()

                    task.setTaskCompleted()
                })
            }
        } else {
            task.setTaskCompleted()
        }
    }
}

func updateComplication() {
    let complicationServer = CLKComplicationServer.sharedInstance()

    for complication in complicationServer.activeComplications! {
        print("UPDATE COMPLICATION")
        complicationServer.reloadTimeline(for: complication)
    }
}
Run Code Online (Sandbox Code Playgroud)

watchkit clockkit apple-watch-complication watchos-3 wkrefreshbackgroundtask

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

当 WKExtension.scheduleBackgroundRefresh 应该调用 scheduleCompletion 处理程序时?

我正在尝试使用这样的行安排后台任务:

WKExtension.shared().scheduleBackgroundRefresh(withPreferredDate: Date(timeIntervalSinceNow: TimeInterval(5) * 60), userInfo: nil, scheduledCompletion: self.scheduledCompletion)
Run Code Online (Sandbox Code Playgroud)

在哪里

func scheduledCompletion(error: Error?) {
        if error == nil { print("successfully scheduled application background refresh") }
        else { print("error scheduling background refresh, error: \(error)") }
}
Run Code Online (Sandbox Code Playgroud)

根据文档

scheduledCompletion 在后台应用程序刷新任务完成后由系统调用的块。

但是由于未知原因,它在调度后台刷新任务后被直接调用。后台刷新任务在正确的时间scheduledCompletion被调用,之后不会被调用。

那么它是文档中的错误,WatchKit 中的错误还是我做错了什么?

swift3 watchos-3 wkrefreshbackgroundtask

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