La descarga de iOS, TaskWithRequest, devuelve cero cuando se llama a la session de background en iPhone, funciona en un simulador

- (NSURLSession *)shanetworkingBackgroundSession { static NSURLSession *shanetworkingBackgroundSession = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.example.apple-samplecode.SimpleBackgroundTransfer.BackgroundSession"]; configuration.URLCache = [NSURLCache shanetworkingURLCache]; configuration.requestCachePolicy = NSURLRequestReturnCacheDataElseLoad; shanetworkingBackgroundSession = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; }); return shanetworkingBackgroundSession; } // When executed on simulator, things work as expected, I never get a nil result. // When executed on iPhone 5s device, nextDownloadTask is always nil NSURLSessionDownloadTask *nextDownloadTask = [[self shanetworkingBackgroundSession] downloadTaskWithRequest:request]; 

¿Algunas ideas?

ACTUALIZACIÓN 12/09/14: Tuve este problema nuevamente, en Google y encontré esta publicación SO y luego vi que era el autor de la pregunta. Esta vez, -URLSession:task:didCompleteWithError ni siquiera recibió llamadas. LA SOLUCIÓN FUE PARA REINICIAR MI TELÉFONO. Esto debe ser un error de Apple. Estoy ejecutando iOS7 en mi iPhone 5s.

Debe implementar URLSession:task:didCompleteWithError: y debe informar errores significativos, si corresponde.

En términos de types de problemas que funcionarían en el simulador y no en el dispositivo, incluyen (a) el uso de localhost en la URL; (b) el uso de las URL solo disponibles en LAN y el dispositivo iOS no se conectan con éxito a través de wifi, por ejemplo, tal vez solo conectando a través de celulares; etc. Tendría que compartir más sobre el tipo de URL a la que se está conectando.

De acuerdo con la documentation , el error -999 es NSURLErrorCancelled . No estoy claro por qué obtendría ese error en particular en este context, a less que estuviera cancelando explícitamente la request o invalidando la session.

En mi caso, pude encontrar una solución para este problema:

1) Llamar a la function shanetworkingBackgroundSession

2) Llame a downloadTaskWithRequest en esa session para comprobar si la session funciona correctamente, es decir, devolver algo que no sea nulo

3) Si falla el n.º 2, intente nuevamente después de un retraso:

 [_shanetworkingBackgroundSession performSelector:@selector(shanetworkingBackgroundSession) withObject:nil afterDelay:0.01]; 

En mi caso, el primer bash a veces falla, a veces tiene éxito. Pero el segundo bash parece tener éxito confiable.

Lo arreglé llamando a [backgroundSession invalidateAndCancel] . Solo tuve que llamar a esto una y otra vez, eliminé el código.

Ahora me pregunto si debería detectar cuándo ya no se pueden crear tareas y llamar a invalidateAndCancel antes de intentar más tareas.

  1. Necesita llamar a invalidateAndCancel para su NSURLSession
  2. Establezca en nulo su NSURLSession
  3. Crear de nuevo NSURLSession
  4. Crear de nuevo NSURLSessionDownloadTask

p.ej

 NSURLSessionDownloadTask *dataTask = [self.yourSession downloadTaskWithRequest:urlRequest]; NSInteger attemptsNumber = 5; for (NSUInteger attempts = 0; !dataTask && attempts < attemptsNumber; attempts++){ [self.yourSession invalidateAndCancel]; self.yourSession = nil; NSURLSessionConfiguration *backgroundConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:[[NSBundle mainBundle] bundleIdentifier]]; self.yourSession = [NSURLSession sessionWithConfiguration:backgroundConfig delegate:self delegateQueue:nil]; dataTask = [self.yourSession downloadTaskWithRequest:urlRequest]; }