WKURLSessionRefreshBackgroundTask não é chamado ao tentar fazer atualizações em segundo plano no watchOS

Estou trabalhando em uma complicação para obter dados agendados de um serviço da web. A cada 20 a 30 minutos (ou manualmente), estou agendando uma WKRefreshBackgroundTask para fazer isso.

Conforme sugerido pela Apple, quero que o sistema operacional lide com a busca desses dados por meio de um plano de fundoNSURLSession.

Esta é a função que eu uso para baixar os dados necessários:

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()
}

Algumas coisas sobre isso:

É chamado quando eu agendar. Eu vejo sua declaração de impressão no console.É quase idêntico ao exemplo da Apple.Omiti o URL. Esse mesmo URL funciona bem nos aplicativos iOS / watchOS, então não há nada errado com ele.

O problema é que, embora eu esteja ligandoresume() na tarefa e permitir que ele ative meu aplicativo quando estiver concluído, isso também não parece acontecer.

Quando concluído, ele deve retornar ao manipulador WKExtensionDelegate:

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)

como umWKURLSessionRefreshBackgroundTask, mas não.

Meu código, idêntico ao código de exemplo da Apple, cria outra sessão, mas volta a se juntar a ela através doWKURLSessionRefreshBackgroundTaskidentificador de É aqui que o delegado é definido para processar os dados baixados. Verifique o código:

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()
        }
    }
}

Mas, novamente, parece que nunca mais volta. Não consigo entender por que isso está funcionando, apesar do código ser idêntico ao código de exemplo da Apple para este projeto:WatchBackgroundRefresh: usando o WKRefreshBackgroundTask para atualizar os aplicativos WatchKit em segundo plano.

Há alguma configuração no meu projeto que estou perdendo? Estou colocando todo esse código noExtensionDelegate, novo no watchOS 3. Também estou em conformidade comWKExtensionDelegate eURLSessionDownloadDelegate.

Agradecemos sua ajuda antecipadamente!

questionAnswers(2)

yourAnswerToTheQuestion