Mar*_*man 7 nsurlsession watchkit watchos watchos-3 wkrefreshbackgroundtask
我正在研究从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)
关于这个的一些事情:
问题是,即使我正在调用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:
// Snapshot tasks have a unique completion call, make sure to set your expiration date
print("\nWatchKit - WKSnapshotRefreshBackgroundTask")
snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil)
case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask:
print("\nWatchKit - WKWatchConnectivityRefreshBackgroundTask")
connectivityTask.setTaskCompleted()
case let urlSessionTask as WKURLSessionRefreshBackgroundTask:
print("\nWatchKit - WKURLSessionRefreshBackgroundTask")
let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: urlSessionTask.sessionIdentifier)
let backgroundSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil)
print("Rejoining session ", backgroundSession)
urlSessionTask.setTaskCompleted()
default:
// make sure to complete unhandled task types
task.setTaskCompleted()
}
}
}
Run Code Online (Sandbox Code Playgroud)
但同样,它似乎永远不会回来.我似乎无法弄清楚为什么这个工作有效,尽管代码与Apple的这个项目的示例代码相同:WatchBackgroundRefresh:使用WKRefreshBackgroundTask在后台更新WatchKit应用程序.
在我的项目中是否有一些我缺少的设置?我将所有这些代码放在ExtensionDelegatewatchOS 3 中的新内容中.我也符合WKExtensionDelegate和URLSessionDownloadDelegate.
感谢您的帮助!
我让它工作了!我首先查看了 WWDC'16 的视频/笔记,将它们与 Apple的WatchBackgroundRefresh示例进行比较。然后,在浏览 Apple Dev 论坛时,我发现了这个帖子,与我们遇到的问题相同。在那里,一个叫“Daniel Fontes”的人发布了他让它工作的“食谱”(注意,不是公认的答案!),并结合对我有用的视频。
我为使 Apple 示例工作所做的工作:
var savedTask:WKRefreshBackgroundTask?handle( backgroundTasks:)函数中,保存WKURLSessionRefreshBackgroundTask到局部变量self.savedTask = task——不要task.setTaskCompleted()(!!)urlSession - didFinishDownloading:,将保存的任务设置为已完成:self.savedTask?.setTaskCompleted()在您阅读收到的数据后。希望这可以帮助!
附:这适用于模拟器(xcode 8.3.3,watchOS 3.2)
我从来没有让苹果的例子工作,但我确实让后台刷新工作。与他们的示例不同,您需要使自己成为会话的代表。因此,请像这样创建后台会话:
让backgroundSession = URLSession(配置:backgroundSessionConfig,委托:self,delegateQueue:nil)
我这里有一个详细的代码示例(请参阅问题的代码):
WatchOS 3 WKApplicationRefreshBackgroundTask didReceiveChallenge
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
2017 次 |
| 最近记录: |