David David - 3 months ago 21
iOS Question

Implementing Long-Running Background Tasks in iOS

my client asks me to develop some app that periodically retrieves the user location & the phone battery status, and then send them to our backend server for data analysis, then feed back by push notification.

But through the app doc, I get to know that from apple ios dev doc:


For tasks that require more execution time to implement, you must
request specific permissions to run them in the background without
their being suspended. In iOS, only specific app types are allowed to
run in the background:

Apps that play audible content to the user while in the background,
such as a music player app

Apps that keep users informed of their
location at all times, such as a navigation app

Apps that support
Voice over Internet Protocol (VoIP)

Newsstand apps that need to
download and process new content

Apps that receive regular updates
from external accessories


I'm wonder if this would be feasible if we wrap this app as some navigation app so we can have long-running background tasks? Does appstore will reject on our app?

BTW, what is the definition of navigation app by Apple?

Answer

You might consider using:

[CLLocationManager startMonitoringSignificantLocationChanges];

This will cause your app to be restarted if it has been killed whenever the location changes significantly, allowing you to update the details on the server at fairly regular intervals, assuming the user is moving. This does not require any special background permission. From the docs:

If you start this service and your application is subsequently terminated, the system automatically relaunches the application into the background if a new event arrives. In such a case, the options dictionary passed to the locationManager:didUpdateLocations: method of your application delegate contains the key UIApplicationLaunchOptionsLocationKey to indicate that your application was launched because of a location event.

Your other option is to configure the app as requiring continuous location updates in the background, but without knowing the primary function of the app it is hard to know if this will pass store submission or not.