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 doWKURLSessionRefreshBackgroundTask
identificador 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!