ios - escuchar - Descargue muchos archivos(fotos, videos) en segundo plano con orden de prioridad
escuchar youtube en segundo plano iphone (2)
Al inicio de la aplicación, quiero descargar todos los archivos del servidor y quiero continuar descargando incluso cuando el usuario abandona la aplicación (no está en primer plano). Los archivos que necesito descargar son miniaturas, fotos en tamaño original, otros archivos y videos. Quiero descargarlos en orden como escribí antes.
Estoy usando Alamofire y configuré el administrador de sesión:
let backgroundManager: Alamofire.SessionManager = {
let bundleIdentifier = "com....."
return Alamofire.SessionManager(
configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background")
)
}()
Entonces lo estoy usando así:
self.backgroundManager.download(fileUrl, to: destination)
.downloadProgress { progress in
//print("Download Progress: /(progress.fractionCompleted)")
}
.response(completionHandler: result)
Está en el método downloadPhoto y lo estoy llamando:
for item in items {
self.downloadPhoto(item: item, isThumbnail: true, shouldReloadData: false, indexPath: nil)
self.downloadPhoto(item: item, isThumbnail: false, shouldReloadData: false, indexPath: nil)
}
Luego podría agregar una llamada para descargar archivos y descargar videos, entre otros. Pero todas estas solicitudes tienen la misma prioridad y me gustaría descargar las miniaturas primero (porque eso es lo que el usuario ve al principio), luego las imágenes de tamaño completo y después de que se descarguen todas las imágenes, luego los archivos y los videos. Pero todo debe estar en cola porque si el usuario inicia la aplicación y luego lo establece en segundo plano y lo deja durante varias horas, todo debe descargarse. es posible? ¿Y cómo puedo hacer esto?
Estaba viendo alamofire que tiene la biblioteca de componentes AlamofireImage que tiene descargas basadas en prioridad pero las imágenes son solo parte de los archivos que quiero priorizar. Gracias por la ayuda
Creo que el estándar de iOS URLSessionDownloadTask
te ayudará. Tiene priority
propiedad, que se parece a lo que necesita.
Aquí está la documentación oficial
Aquí hay un tutorial
Eche un vistazo a TWRDDownloadManager . Utiliza NSURLSessionDownloadTask
y también admite modos de fondo.
Lo que debes hacer es:
1. Establezca HTTPMaximumConnectionsPerHost
en 1 para asegurarse de que la descarga se HTTPMaximumConnectionsPerHost
en serie:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.timeoutIntervalForRequest = 30.0;
configuration.HTTPMaximumConnectionsPerHost = 1; // Note this
2. A continuación está el método que itera para el bucle y descarga los medios uno por uno:
-(void)downloadDocuments
{
for(int i=0; i<[arrDownloadList count]; i++)
{
Downloads *download = [arrDownloadList objectAtIndex:i];
NSString *fileURL = download.documentURL;
[[TWRDownloadManager sharedManager] downloadFileForURL:fileURL
withName:[fileURL lastPathComponent]
inDirectoryNamed:kPATH_DOC_DIR_CACHE_DOCUMENTS
completionBlock:^(BOOL completed)
{
if (completed)
{
/* To some task like database download flag updation or whatever you wanr */
downloadIndex++;
if(downloadIndex < [arrDownloadList count]) {
[self updateDownloadingStatus];
}
else {
[self allDownloadCompletedWithStatus:TRUE];
}
}
else
{
/* Cancel the download */
[[TWRDownloadManager sharedManager] cancelDownloadForUrl:fileURL];
downloadIndex++;
if(downloadIndex < [arrDownloadList count]) {
[self updateDownloadingStatus];
}
else {
[self allDownloadCompletedWithStatus:TRUE];
}
}
} enableBackgroundMode:YES];
}
}
No olvide activar el modo de fondo:
enableBackgroundMode:YES
3. Habilite los Background Modes
en Xcode:
4. Agregue el siguiente método a su AppDelegate
:
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
[TWRDownloadManager sharedManager].backgroundTransferCompletionHandler = completionHandler;
}
Si lo hace, la descarga se realizará en serie y continuará incluso si la aplicación está en segundo plano o si el usuario bloquea el dispositivo.
Por favor, agregue comentario en caso de cualquier pregunta o ayuda con respecto a esto.