WKURLSessionRefreshBackgroundTask no se llama al intentar hacer actualizaciones de fondo en watchOS
Estoy trabajando en una complicación para obtener datos programados de un servicio web. Cada 20-30 minutos (o manualmente), estoy programando una WKRefreshBackgroundTask para hacer esto.
Como sugirió Apple, quiero que el sistema operativo maneje la obtención de estos datos a través de un fondoNSURLSession
.
Esta es la función que uso para descargar los datos que necesito:
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()
}
Algunas cosas sobre esto:
Se llama cuando lo programo. Veo su declaración de impresión en la consola.Es casi idéntico al ejemplo de Apple.He omitido la URL. Esa misma URL funciona bien en las aplicaciones iOS / watchOS, por lo que no tiene nada de malo.El problema es que, aunque estoy llamandoresume()
en la tarea y permitir que active mi aplicación cuando esté completa, tampoco parece funcionar.
Cuando se complete, debería volver a un controlador WKExtensionDelegate:
func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)
como unWKURLSessionRefreshBackgroundTask
Pero no lo hace.
Mi código, idéntico al código de muestra de Apple, crea otra sesión pero vuelve a unirse a través deWKURLSessionRefreshBackgroundTask
El identificador. Aquí es donde se establece el delegado para procesar los datos descargados. Revisa el 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()
}
}
}
Pero de nuevo, parece que nunca volverá. Parece que no puedo entender por qué esto funciona a pesar de que el código es idéntico al código de muestra de Apple para este proyecto:WatchBackgroundRefresh: uso de WKRefreshBackgroundTask para actualizar las aplicaciones WatchKit en segundo plano.
¿Hay alguna configuración en mi proyecto que me falta? Estoy poniendo todo este código en elExtensionDelegate
, nuevo en watchOS 3. También me estoy ajustando aWKExtensionDelegate
yURLSessionDownloadDelegate
.
Gracias de antemano por su ayuda!