2012-01-14 10 views
20

Quando l'app viene scaricata inizialmente, l'utente deve scaricare un file di grandi dimensioni come 200 MB (limite superiore). Non posso assolutamente aspettarmi che l'utente tenga l'app aperta finché questo file non viene scaricato. Così lui/lei potrebbe chiudere l'applicazione & l'app andrà in background.Download di sfondo iOS quando l'app non è attiva

Come posso continuare a scaricare il file in questo scenario? Questo è possibile anche in iOS?

+0

finalmente sei riuscito a scaricare quel file in background? – Mahesh

+0

Vedere la risposta di MMR di seguito. Lo sfondo reale 'NSURLSession' è il modo migliore per ottenere questo al giorno d'oggi. Tutte queste altre risposte precedono questa tecnica. Se hai un piccolo download che richiede meno di 3 minuti per terminare, l'attività in background è un buon approccio, ma per i grandi download in background, usa lo sfondo 'NSURLSession'. – Rob

risposta

7

E 'possibile avviare un'attività in background quando si inizia il download:

applicazioni che stanno passando allo sfondo può richiedere un extra quantità di tempo per completare qualsiasi importanti compiti dell'ultimo minuto.

Executing a Finite-Length Task in the Background

Tuttavia, una tale attività è limitata ad una quantità di tempo indefinito esecuzione da parte del sistema. Tuttavia, un download di file da 200 Mb potrebbe essere un'attività troppo grande in questo caso.

+0

Sì. Potresti voler utilizzare una libreria di rete che ti consente di mettere in pausa e riprendere i download dal punto in cui erano stati interrotti, in modo che l'utente non debba ricominciare da capo se il download viene interrotto. ASIHttpRequest può farlo, ma non è più supportato poiché non funziona con ARC. –

+2

questo non è più corretto. Su ARC per ASIHttp, è possibile utilizzare una libreria statica compilata con ambiente non ARC. – samfisher

37

Aggiungi qui sotto nella tua - (void)applicationDidEnterBackground:(UIApplication *)application

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
}]; 

e vi sono buone per andare ... ho questo in uno dei miei pubblicato gestore di download di app

Questo funzionerà bene. Puoi anche controllare quanto tempo hai, dato che Apple abilita solo 10 minuti di attività in background. Usa:

NSTimeInterval ti = [[UIApplication sharedApplication]backgroundTimeRemaining]; 
NSLog(@"backgroundTimeRemaining: %f", ti); // just for debug 
+0

Quindi con questo posso scaricare? C'è un limite di tempo come dice @nick sopra? –

+10

sì .. apple parla del limite di tempo .. ma posso scaricare un file con dimensione di 800 mb con il codice sopra .. e l'app è in app store .. – Saurabh

+0

Eeeek !!! quel tuo commento è preziosa info @Saurabh. Grazie!! – samfisher

3

AFNetworking permette di eseguire operazioni pesanti in background.

AFNetworking La libreria è un'eccellente combinazione di NSURLConnection e NSOperationQueue. Questa libreria viene utilizzata per il download asincrono sullo sfondo che non influisce sull'altra applicazione.

AFNetworking consente di gestire il download con ExpirationHandle, ad esempio, se, comunque, durante lo scaricamento la connessione viene persa, si collegherà nuovamente ad essa.

raccolta origini per AFNetworking

Fonte RiferimentoAFNetworking works in Background

di Apple Riferimento linkApple

esecuzione in background e Multitasking Apple

5

In una delle mie app, stavo caricando enormi quantità di dati. Non posso assolutamente aspettarmi che l'utente tenga l'app in primo piano fino al download dei dati. Uso il seguente codice per scaricare i dati mentre l'app è in background.Il suo lavoro correttamente :-)
prega di passare attraverso passaggi seguenti:

1) utilizzare seguente riga nel file di intestazione di ViewController

@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 

sintesi nel file di .m.

2) in viewDidLoad assegno UIBackgroundTaskIdentifier come:

self.backgroundTask = UIBackgroundTaskInvalid; 

3) Uso seguente riga di codice, qui sto solo mantenendo sulla metodo getDataFromServer all'interno beginBackgroundTaskWithExpirationHandler: blocco.

 self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 

     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    }]; 

    /* Here your downloading Code, let say getDataFromServer method */ 

    [self getDataFromServer]; // Its dummy method 

    /* Your downloading Code End Here */ 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    }); 

4) Se si desidera controllare il tempo rimanente per scaricare i dati in background, includere seguente riga nel applicationDidEnterBackground: (UIApplication *) metodo delegato applicazione di AppDelegate:

 NSLog(@"Background time remaining = %.1f seconds", [UIApplication sharedApplication].backgroundTimeRemaining); 
+0

Risposta cristallina, grazie mille per l'aiuto – byJeevan

0
#pragma mark - View Loading handling 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; 
} 

#pragma mark - Background handling when application goes background 
UIBackgroundTaskIdentifier background_task; 
- (void)appDidEnterBackground:(NSNotification *)notification { 
    UIApplication *application = [UIApplication sharedApplication]; 
    if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) 
    { 
     NSLog(@"Multitasking Supported"); 
     if (background_task == UIBackgroundTaskInvalid) { 
      background_task = [application beginBackgroundTaskWithExpirationHandler:^ { 
       NSLog(@"Background task expiration\n"); 
       //Clean up code. Tell the system that we are done. 
       [application endBackgroundTask: background_task]; 
       background_task = UIBackgroundTaskInvalid; 
      }]; 
      //To make the code block asynchronous 
      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
       //### background task starts 
       NSLog(@"Running in the background\n"); 
       for(int cnt=0; cnt<10; cnt++) //while(TRUE) 
       { 
        NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]); 
        [NSThread sleepForTimeInterval:1]; //wait for 1 sec 
       } 
       //#### background task ends 
       //Clean up code. Tell the system that we are done. 
       NSLog(@"here you can do something before it really enters background"); 
       [NSThread sleepForTimeInterval:1]; //wait for 1 sec 
       [application endBackgroundTask: background_task]; 
       background_task = UIBackgroundTaskInvalid; 
      }); 
     } 
     else 
     { 
      NSLog(@"Multitasking Not Supported"); 
     } 
    } 
} 

Puoi per saperne di più da questo slide.
Ho solo apportato alcune semplici modifiche utili dallo snippet di questa diapositiva. Spero che questo aiuti.

0

Costruire una applicazione NewsStand iOS; non è un'applicazione iOS standard.

Standart iOS aplications:

  • non possono scaricare i dati quando è chiuso.
  • può scaricare i dati in un tempo limitato quando viene trasferito sullo sfondo.
  • Non c'è abbastanza tempo per scaricare 200mb.

Le applicazioni NewsStand hanno un privilegio di tempo extra da scaricare quando chiuso o in Background. Una volta ogni 24 ore, hanno il privilegio di rispondere a una chiamata delegata di RemoteContentReady.

Creazione di un'applicazione newsStand non è diversa dalla creazione di un'applicazione iOS standard. Lo contrassegni solo come nuova applicazioneStand.

Quindi si avrà il privilegio di eseguire il codice che si trova all'interno della delega RemoteContentReady.

Per ricevere il segnale RemoteContentReady, è necessario inviare un segnale dal proprio server (C#, php, bla bla).

Non per ogni singola app iOS. Qualcosa come un segnale di notazione remota. Per ottenere questo, potresti aver bisogno della certificazione SSL per il tuo sito web.

migliori saluti

+0

Non lo sapevo, grazie per la condivisione @ Add080bbA – Prashant

5

Si potrebbe utilizzare NSURLSession introdotto in iOS 7.0 e versioni successive per continuare il caricamento/download di un file anche quando l'applicazione è sospesa.

Apple documentation

La classe NSURLSession e classi correlate forniscono un'API per il download di contenuti. Questa API fornisce un ricco set di metodi delegati per supportare l'autenticazione e offre all'app la possibilità di eseguire lo download in background quando l'app non è in esecuzione o, in iOS, mentre l'app è sospesa.

E

sessioni di sfondo consentono di eseguire upload e download di contenuti in background mentre la vostra applicazione non è in esecuzione. È possibile creare una configurazione di sessione in background chiamando lo backgroundSessionConfiguration: metodo sulla classe NSURLSessionConfiguration .

Un tutorial interessante per utilizzare NSURLSession in questo link.

+0

Questa è la risposta corretta. Usa background 'NSURLSession'!Le altre risposte pre-data questa tecnica, ma questo è ora il modo migliore per realizzare lunghi download che potrebbero superare i 3 minuti consentiti dall'approccio 'UIBackgroundTask'. – Rob

Problemi correlati