cjhill
cjhill

Reputation: 1054

iPhone app background downloads

I'm making an app that receives constant updates (potentially hundreds of times a day) and, to make for a better user experience, it would be nice to have these downloaded in the background.

Looking at Apple's[1] documentation I need to set the background mode to "Background fetch". Exploring deeper you can read about the application:performFetchWithCompletionHandler[2] function which states that:

When this method is called, your app has up to 30 seconds of wall-clock time to perform the download operation and call the specified completion handler block... If your app takes a long time to call the completion handler, it may be given fewer future opportunities to fetch data in the future.

The problem is our downloads will take longer than 30 seconds to download, and as such would rather not face the wrath of Apple sending updates fewer and farther between, thus exacerbating the issue!

So, am I able to do this somehow?

Also, I have created a crude experiment whereby I create a NSTimer:scheduledTimerWithTimeInterval to run every minute which logs to the console. This successfully works both on the iPhone in simulation (has been running for 30 mins plus) and also when I place it on a phone (a week plus)... why would this be!?

Upvotes: 2

Views: 1148

Answers (2)

cjhill
cjhill

Reputation: 1054

Found a solution:

You can bypass Apple's application:performFetchWithCompletionHandler function and set your own timer. To do this make sure you do the following:

  1. Have selected Background fetch under Your app settings > "Capabilities" > "Background Modes".

  2. In AppDelegate.m, within application:didFinishLaunchingWithOptions, add the following code:

    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        // Nothing
    }];
    
  3. You can now add a NSTimer in your AppDelegate and it will continue to run whilst in the background. E.g.,

    _timerBg = [NSTimer scheduledTimerWithTimeInterval:1800
                                                target:self
                                              selector:@selector(bgFunction)
                                              userInfo:nil
                                               repeats:YES];
    

Upvotes: 0

Rémi Belzanti
Rémi Belzanti

Reputation: 423

It may be hard to do because of the Apple 30s obligation. They decided so to eventually prevent big download to happen not to drain battery and data plan.

You must be sure you really need to download that much data (as it takes this long) in background, plus hundred times a day!

I mean, when your app goes foreground after a (long) background period, it may not be updated and it's normal case. So you need to do the update when the app goes foreground; only one update is needed. Otherwise, you should step back and rethink the update process.

Upvotes: 2

Related Questions