Я работаю над усложнением, чтобы получить запланированные данные из веб-службы. Каждые 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()
}
Несколько вещей об этом:
- Он вызывается, когда я его планирую. Я вижу его оператор печати в консоли.
- Это почти идентично примеру Apple.
- Я пропустил URL. Тот же URL-адрес отлично работает в приложениях iOS/watchOS, так что с ним все в порядке.
Проблема в том, что хотя я вызываю resume()
для задачи и позволяю ей разбудить мое приложение после ее завершения, похоже, это тоже не работает.
Когда он завершится, он должен вернуться к обработчику WKExtensionDelegate:
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)
как 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()
}
}
}
Но опять же, кажется, что он никогда не вернется. Я не могу понять, почему это работает, несмотря на то, что код идентичен коду примера Apple для этого проекта: WatchBackgroundRefresh: использование WKRefreshBackgroundTask для обновления приложений WatchKit в фоновом режиме.
Есть ли в моем проекте какая-то настройка, которую мне не хватает? Я помещаю весь этот код в ExtensionDelegate
, новое в watchOS 3. Я также соответствую WKExtensionDelegate
и URLSessionDownloadDelegate
.
Заранее спасибо за помощь!