2012-01-14 66 views
20

當我的應用程序最初下載時,用戶需要下載一個像200MB(上限)的大文件。我絕對不能指望用戶在下載此文件之前保持應用程序的打開狀態。所以他/她可能會關閉應用程序&該應用程序將進入後臺。iOS後臺下載,當應用程序不活躍

如何在這種情況下繼續下載文件?這甚至可以在iOS?

+0

終於你能夠在後臺下載該文件? – Mahesh 2016-06-03 15:15:09

+0

請參閱下面的MMR的答案。真正的背景'NSURLSession'是實現這一點的最佳方式。所有這些其他答案都是在此技術之前進行的。如果你有一個小小的下載需要不到3分鐘的時間完成,後臺任務是好辦法,但對於大背景下載,使用背景'NSURLSession'。 – Rob 2016-07-07 11:51:00

回答

7

這是可能的,當你開始下載啓動一個後臺任務:即將轉移到後臺可以要求額外 量的時間來完成任何重要的最新任務

應用。

Executing a Finite-Length Task in the Background

然而,這樣的任務被限制在由系統未定義量的執行時間。但是,在這種情況下,200Mb文件下載可能太大。

+0

是的。您可能需要查看使用網絡庫的方法,該網絡庫允許您暫停並從停止的位置繼續下載,以便用戶在下載中斷時不必從頭開始重新開始。 ASIHttpRequest可以做到這一點,但它不再支持,因爲它不適用於ARC。 – 2012-01-14 11:47:43

+2

那不正確了。在ARC for ASIHttp上,您可以使用在非ARC環境下編譯的靜態庫。 – samfisher 2013-04-12 05:21:25

37

- (void)applicationDidEnterBackground:(UIApplication *)application

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

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

下方添加,你是好去...我有這個在我發表的下載管理器應用程序

這會工作得很好的一個。你也可以檢查你有多少時間,因爲蘋果只啓用10分鐘的後臺任務。用途:

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

那麼這個我可以下載?有沒有像@nick上面所說的時間限制? – 2012-01-14 14:40:27

+10

是的..蘋果談論的時間限制..但我可以下載一個文件大小爲800 MB與上述代碼..和應用程序在應用商店.. – Saurabh 2012-01-14 14:59:03

+0

哇!你的評論是寶貴的信息@沙拉布。謝謝!! – samfisher 2012-01-14 16:08:17

3

AFNetworking可以讓你在後臺執行繁重的操作。

AFNetworking庫是NSURLConnection和NSOperationQueue的完美結合。該庫用於在不影響其他應用程序的背景下進行異步下載。

AFNetworking允許您使用ExpirationHandle處理下載,即無論如何在下載期間連接丟失,它都會再次連接到它。

庫源AFNetworking

參考源AFNetworking works in Background

蘋果參考鏈接Apple

後臺執行和多任務處理Apple

5

在我的一個應用程序中,我正在加載大量數據。我絕對不能指望用戶在下載數據之前將應用保持在前臺。我只是使用下面的代碼來獲取數據下載,而應用程序在後臺。它的正常工作:-)
請通過以下步驟:

1)使用以下行的ViewController

合成它在.m文件的
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 

頭文件。

2)在viewDidLoad中分配UIBackgroundTaskIdentifier像:

self.backgroundTask = UIBackgroundTaskInvalid; 

3)使用下面的代碼行,在這裏我只是保持在getDataFromServer方法內beginBackgroundTaskWithExpirationHandler:塊。

 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)如果您要檢查剩餘時間在後臺下載數據,包括applicationDidEnterBackground以下行:(UIApplication的*)應用程序委託的AppDelegate的方法:

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

晶瑩剔透的答案,非常感謝您的幫助 – byJeevan 2015-07-06 09:55:46

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"); 
     } 
    } 
} 

你可以從這個slide知道更多。
我只是從這張幻燈片的片段做一些簡單有用的修改。 希望這有助於。

0

構建newsStand iOS應用程序;不是一個標準的iOS應用程序。

斯坦達特的iOS aplications:關閉時

  • 不能下載數據。
  • 可以在推送到後臺時在有限的時間內下載數據。
  • 沒有足夠的時間下載200MB。

NewsStand應用程序在關閉或inBackground時有額外的時間權限下載。 每24小時一次,他們有權回答remoteContentReady委託調用。

構建newsStand應用程序與構建非標準iOS應用程序沒有區別。您只需將其標記爲newStand應用程序即可。

然後您將有權運行位於remoteContentReady委託內的代碼。

要接收remoteContentReady信號,您必須從您的serverside(c#,php,bla bla)發送一個信號。

不適用於每個iOS應用。像一個remoteNotification信號。您可能需要爲您的網站獲得ssl認證才能完成此操作。

問候

+0

不知道這個,謝謝分享@ Add080bbA – Prashant 2018-02-07 12:00:19

5

你可以使用NSURLSession中的iOS 7.0推出以後繼續即使該應用程序被暫停的文件的上傳/下載。

Apple documentation

的NSURLSession類和相關類提供了 下載內容的API。此API提供了一套豐富的委託方法 以支持身份驗證,併爲您的應用提供在您的應用未運行時執行後臺下載或在您的應用暫停時在iOS中執行 的能力。

而且

背景會話讓你在後臺執行上傳和內容 下載,而你的應用程序沒有運行。您可以通過調用 backgroundSessionConfiguration: NSURLSessionConfiguration類的方法來創建後臺會話配置。

一個很酷的教程,在這個link使用NSURLSession。

+0

這是正確答案,使用後臺'NSURLSession'!其他答案會在此技術發佈之前進行,但這是實現長時間下載的最佳方式,可能會超過「UIBackgroundTask」方法允許的3分鐘。 – Rob 2016-07-07 11:41:47

相關問題