调用设备上的watchOS3句柄(_ backgroundTasks:Set <wkrefreshbackgroundtask>)

时间:2016-08-29 08:56:31

标签: ios watchkit

我发现这个方法是在模拟器上调用的,但是在真正的手表设备上,它永远不会被调用。 Apple的简单代码和我的测试。

我想知道的是我的错误还是Apple的错误。

我的代码 -

class InterfaceController: WKInterfaceController, WKExtensionDelegate {


    @IBOutlet var textLbl: WKInterfaceLabel!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        WKExtension.shared().delegate = self

        // Configure interface objects here.
    }

    func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
        for task : WKRefreshBackgroundTask in backgroundTasks {
            if task is WKSnapshotRefreshBackgroundTask {
                textLbl.setText("hahahah");
                task.setTaskCompleted()
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

官方Apple代码示例WatchBackgroundRefresh在watchOS 3.0(14S326)上也以相同方式失败。我在自己的代码中也看到了相同的失败,尽管它与之前的3.0测试版一起使用。

另一个症状是没有调用handle(...)进行快照刷新,即WKSnapshotRefreshBackgroundTask任务。

我已经提交了一份Apple错误报告,该报告在OpenRader上列出: http://www.openradar.me/radar?id=6720257230110720

最后,我注意到Apple Stocks应用程序确实获得了后台刷新。所以我不确定为什么这会起作用,而其他应用程序会失败。

答案 1 :(得分:0)

我设法通过将scheduledCompletion属性指向“真实”函数而不是闭包来找到一种解决方法,例如。

WKExtension.shared().scheduleBackgroundRefresh(
                  withPreferredDate: nextRefreshTime!, 
                  userInfo: nil, 
                  scheduledCompletion: self.backgroundRefreshRunning)
...

private func backgroundRefreshRunning(error: Error?) {
    if (error != nil) {
        print("Error running background task: \(error.debugDescription)")
    }
}

现在似乎工作正常!

我的猜测是Swift 3编译器中存在一个错误。我曾经使用内联闭包为scheduledCompletion值,这个工作正常,直到我将我的代码从Swift 2.3更新为Swift 3