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.

Заранее спасибо за помощь!

Ответы на вопрос(2)

Ваш ответ на вопрос