¡Hola! Necesito saber cómo puedo hacer que mi aplicación para iOS inicie una descarga en segundo plano de la aplicación (por ejemplo, que la descarga se ejecute en el archivo AppDelegate), por lo tanto, el cambio de ViewControllers no interrumpirá ni cancelará la descarga. También necesito poder obtener el progreso de la descarga (0.00000 - 1.00000
), para establecer un objeto UIProgressView
, lo que también significa que necesito una función - (void)progressDidChangeTo:(int)progress
.iOS Aplicación Descarga de fondo
Respuesta
Sólo tiene que utilizar ASIHTTPRequest que es la forma más fácil que NSURLRequest y hace exactamente lo que necesita. Es examples que muestra cómo descargar en segundo plano y cómo informar el progreso.
No descargaría nada en AppDelegate directamente. En cambio, crearía una clase separada solo para ese propósito. Llamémoslo MyService
Inicializaría esa clase en el delegado de mi aplicación.
La clase puede funcionar como singleton o puede pasarse a cada controlador de vista que lo requiera.
En la clase MyService
, agregaría ASINetworkQueue y algunos métodos para manejar las solicitudes cuando estén listas. Aquí está el código de ejemplos de ASI que puede usar:
- (IBAction)startBackgroundDownloading:(id)sender
{
if (!self.queue) {
self.queue = [[[ASINetworkQueue alloc] init] autorelease];
}
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];
[self.queue addOperation:request]; //queue is an NSOperationQueue
[self.queue go];
}
- (void)requestDone:(ASIHTTPRequest *)request
{
NSString *response = [request responseString];
//Do something useful with the content of that request.
}
- (void)requestWentWrong:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}
Si necesita establecer la barra de progreso. Me acaba de exponer el setDownloadProgressDelegate de ASINetworkQueue en mi clase MyService y la puso en mis ViewControllers así:
[[MyService service] setDownloadProgressDelegate: self.myUIProgressView];
cierto. Si necesita seguir descargando incluso cuando su aplicación se cierra, puede configurar ShouldContinueWhenAppEntersBackground
la propiedad de su solicitud en SÍ.
puede usar NSURLConnection para iniciar una solicitud asincrónica que no causará la congelación de su IU. Puede hacerlo haciendo algo como:
NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
[urlRequest release];
el fin de tener su progreso puede utilizar el:
connection:didReceiveResponse:(NSURLResponse *)response;
llamada delegado para inspeccionar el response.expectedContentLength y luego usar el
connection:didReceiveData:(NSData *)data
para rastrear la cantidad de datos que se descargaron y calcular un porcentaje.
Espero que esto ayude, Moszi
Tengo la parte de descarga abajo, usando ASIHTTPRequest, solo necesito saber cómo implementar la descarga para comenzar en segundo plano, en lugar del UIViewController abierto actual, de modo que cuando el controlador de vista se descarta, la descarga continúa. –
Puede crear una clase singleton para administrar su descarga, de esta manera esta clase estará disponible incluso si su controlador de vista está desasignado. (patrón singleton en wikipedia: http://en.wikipedia.org/wiki/Singleton_pattern) – Moszi
- 1. Continuar descarga en el fondo
- 2. Aplicación iOS ejecutando tareas en el fondo
- 3. iOS Antecedentes descarga cuando la aplicación no está activa
- 4. iOS AVAudioPlayer detiene la música de fondo de otra aplicación
- 5. android: descarga de archivos en el fondo
- 6. iOS: finalización de una tarea al ingresar el fondo
- 7. Audio de fondo iOS en una aplicación web
- 8. Descarga progresiva de video en iOS
- 9. Guardar aplicación en forground (iOS)
- 10. iOS UIView imagen de fondo
- 11. Imagen de fondo de iOS 6
- 12. descarga y descomprime el archivo en iOS
- 13. continuación de la descarga después de que la aplicación vaya al fondo
- 14. Dibujando un hilo de fondo en iOS
- 15. iOS lino de luz de fondo?
- 16. barra de progreso mientras la descarga de archivos IOS
- 17. Monitoreo de Región de iOS en Modo de Fondo
- 18. Tasa de bloqueo de la aplicación iOS: nivel de ruido de fondo?
- 19. Accidente de OpenGL ES en movimiento de fondo, iOS 5.1
- 20. iOS encuesta de fondo sin servicios de ubicación
- 21. ¿Puede una aplicación de iOS recibir una advertencia de memoria en el fondo?
- 22. Comportamiento de subprocesos al ingresar fondo en iOS multitarea
- 23. iOS 4: Controles remotos para audio de fondo
- 24. ¿Cómo saber si la aplicación se termina por el usuario o iOS (después de fondo 10min)
- 25. iOS 5.1: - [UIColor colorWithPatternImage:] color de fondo dibuja negro
- 26. envía un correo electrónico en el Fondo de iOS
- 27. UITextField cambio de comportamiento de fondo de iOS 4 a iOS 5
- 28. Aplicación web que se ocupa de los archivos-descarga de descarga
- 29. Validar una aplicación de iOS
- 30. Aplicación de despertador en iOS
... Yo soy. Necesito que la descarga se realice en el archivo AppDelegate, de modo que la descarga no se detenga cuando comience el UIViewController que la inició. Necesito saber cómo puedo obtener un UIViewController para iniciar y acceder al objeto ASIHTTPRequest, pero tengo el objeto retenido en AppDelegate. –
@hankweb, acabo de actualizar mi respuesta. –
El problema es que se invocará reportFailure en ASIHTTPRequest.m cada vez que mi aplicación regrese del fondo. Uso el mismo método que sugirió en su publicación y el ShouldContineWhenAppEntersBackground establecido en SÍ. –