WKURLSessionRefreshBackgroundTask не вызывается при попытке выполнить фоновое обновление в watchOS
Я работаю над усложнением, чтобы получить запланированные данные из веб-службы. Каждые 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
.
Заранее спасибо за помощь!