Download multiple files using iOS background transfer service
Asked Answered
E

2

7

Here is the question: how to download a number of files one by one using the new Background Transfer Service (including the case when the app is suspended)? I read this awesome tutorial on objc.io and got it working for one file. But I need to download files one by one (so adding multiple NSURLSessionDownloadTaskss will not work (since download URLs are only valid for a short amount of time)

Basically what I am trying to do is to schedule another download once the app is notified that the previous download finished in application:handleEventsForBackgroundURLSession:completionHandler:. But I only get this method invoked once. Any idea why? Any advice on how to implement sequential downloads for multiple files when the app is suspended is appreciated.

UPDATE:

Sorry, I probably was not clear about what the actual problem is: it's not that I do not get notified about the task completion in general, it's that I do not have application:handleEventsForBackgroundURLSession:completionHandler: called for the second download task when the app is running in the backgorund. I do get it invoked for the first download task (which started while the app was in the foreground and then went to background before the download finished) then I fire the second download task, call the completionHandler I got in application:handleEventsForBackgroundURLSession:completionHandler: and never have this method invoked for the second file.

Ellita answered 3/4, 2014 at 15:57 Comment(0)
T
1

From a perspective of this tutorial here (http://www.appcoda.com/background-transfer-service-ios7/) it looks like you have to start the download of those two files simultaneously. As you have a configuration for the maximum connections per host in a session, I guess you can limit the parallel downloads to 1, and just kick off both downloads.

I am currently trying to port this to MonoTouch ... seems promising ...

Theorist answered 23/2, 2015 at 13:36 Comment(2)
what if we face a situation that we should download multiple files consecutively in background when task1 is complete task2 is begin and if task1 fails app terminates?Egotist
@Hadizamani As iOS is first downloading the file to a temporary folder, you'll not see anything of the partially downloaded file. I guess you'll neither be able to get access to the already downloaded part of the file.Theorist
L
2

I would suggest adding next file in NSURLSessionTaskDelegate's - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error. This method is called whenever previous task completes, so looks like a reasonable choice to enqueue next file.

Liquor answered 3/4, 2014 at 16:5 Comment(3)
Please see the updated question. Firing the second download in URLSession:task:didCompleteWithError: does not solve the problem, I still do not have application:handleEventsForBackgroundURLSession:completionHandler: called for the second file.Ellita
Hmm, I see. Definitely seeing strange behaviour: I think I've reproduce what you're describing in a sample PoC app. What is puzzling, however, is that larger app we have in prod doesn't exhibit similar behaviour (and my answer was based on that). Not quite sure what's happening there :/Liquor
The excellent article linked by the O.P., mentions that: if your applications initiates a background transfer while it is in the background, that background transfer will always get the discretionary flag. With the approach above, the second, and any future transfers, will be initiated while the application is in the background. This means they'll only complete when the device has WiFi (not cellular) and good battery. I think they'll also be batched. Perhaps it is working, but it's just taking a while?Enameling
T
1

From a perspective of this tutorial here (http://www.appcoda.com/background-transfer-service-ios7/) it looks like you have to start the download of those two files simultaneously. As you have a configuration for the maximum connections per host in a session, I guess you can limit the parallel downloads to 1, and just kick off both downloads.

I am currently trying to port this to MonoTouch ... seems promising ...

Theorist answered 23/2, 2015 at 13:36 Comment(2)
what if we face a situation that we should download multiple files consecutively in background when task1 is complete task2 is begin and if task1 fails app terminates?Egotist
@Hadizamani As iOS is first downloading the file to a temporary folder, you'll not see anything of the partially downloaded file. I guess you'll neither be able to get access to the already downloaded part of the file.Theorist

© 2022 - 2024 — McMap. All rights reserved.