2016-01-13 50 views
1

在我的應用程序中,我在後臺使用了NSURLSessionDownloadTask。當應用程序處於前臺時,我將恢復一個下載任務。稍後,當應用程序再次處於後臺時,該下載任務將完成,並且在功能didCompleteError中,我希望在應用程序仍處於後臺時創建另一個下載任務。但下載任務不運行。誰能幫我?ios - 在後臺創建會話下載任務

+0

你需要在你的問題中包含相關的代碼。 – ajshort

+0

in func didCompleteError,我創建了下載任務: dispatch_async(dispatch_get_main_queue(),^ { NSURLSessionDownloadTask * downloadTask = [self.session downloadTaskWithResumeData:movie。resumeData]; [downloadTask resume]; }); 當我在模擬器或Xcode設備上調試時,下載任務恢復。但在沒有xcode的設備上運行,下載任務不運行。 – AChen

回答

2

試試這個代碼:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite 


-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 


-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes 


-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location 

不像NSURLConnection,我們通常創建每個請求的連接,與NSURLSession,我們創建一個會話,而是有多個任務。

所以,讓我們定義我們的會議:

NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfiguration:@「myUniqueAppID」]; 
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

我們正在做的第一,是創建一個配置,這將允許它在後臺運行。該配置需要一個專用於您的應用的唯一標識符。使用應用程序的包標識符是很好的做法,比如com.yourCompany.appName

一旦我們有了我們的配置,我們就可以實例化我們的會話,在那裏我們傳遞給委託的引用以及我們希望它運行的隊列。你最喜歡的將會是這個mainQueue。

有關此主題的目的,我們將只黏合下載任務。所以,一旦你知道該網址,您要下載的文件,你可以通過你的會話創建downloadTask:

NSURLSessionDownloadTask* task = [_session downloadTaskWithRequest:request]; 

[task resume]; 

現在的樣子,NSURLSession的作品,是它直接下載文件到臨時目錄。所以你不必擔心存儲它。

雖然它的下載,雖然,它會通知你多少已經被下載,這是偉大的通知的下載進度用戶:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite 
{ 
    CGFloat percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite; 
    // Notify user. 
} 

一旦文件被下載了以下方法將被調用:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location 
{ 
    // Either move the data from the location to a permanent location, or do something with the data at that location. 
} 

該方法的最後一個參數是數據下載到的位置。從這裏,你可以將文件移動到一個永久的地方,在那裏你可以使用它,或者你可以訪問數據並對它做些什麼。但是,這些數據不會留在那裏,所以如果你真的需要它,請確保不要離開它。

值得一提的是任務,就像一個NSURLConnection可以取消:

[_currentTask cancel]; 

這大約佔地下載使用NSURLSession文件的基礎知識。

我希望你覺得這個有用!

+0

感謝您的幫助。我的應用程序運行良好,與您的指南相同的代碼。 。但我想問在後臺應用程序,我恢復另一個下載任務。在模擬器上,下載任務恢復正常,但在設備上,下載任務不能恢復。 – AChen

+0

如果此代碼對您有幫助,請接受我的回答。 –

+0

設備中發生了什麼錯誤? –