Reputation: 13345
I want to track the user location in background, in the purpose to show him an alert when he is close to one of his friend.
So i start with CLLocationManager
. As far as i know their is only one reliable way to let the app know about the location update even if the user reboot the Iphone or kill the app: startMonitoringSignificantLocationChanges
. But the problem is that even inside a city with many wifi, startMonitoringSignificantLocationChanges
fire the DidUpdateLocations
when the user move around 1km and that is really too much for my need
on the other way startUpdatingLocation
is firing DidUpdateLocations
at good interval (even too much because even when the user do not move it's fire quite often DidUpdateLocations
). But startUpdatingLocation
not survive to iphone reboot or app being killed by the user. Also I suspect that even with an accuracy of 100m, startUpdatingLocation
use lot of battery consumption.
So the question: What strategy i can use in my app to track efficiently without draining too much the battery the user location at full time? I need an accuracy of around 100m and if possible an interval between 2.5 - 5 min for each track (i didn't find any option to specify a delay to wait before to catch a new location)
Actually i think to do something like this :
locationManager
, 1 GPS and 1 Significant Changes startMonitoringSignificantLocationChanges
and startMonitoringVisits
startUpdatingLocation
to retrieve the accurate user position. I set up PausesLocationUpdatesAutomatically(true)
so that the GPSLocationManager will stop by himself soon or lateDidUpdateLocations
raise by the GPSLocationManager I start monitoring region enter/exit (100m radius around the obtained latitude/longiture) with significantChangesLocationManagerWhat do you think of such strategy ?
Upvotes: 2
Views: 840
Reputation: 2343
As mentioned in comments, here are some approach I had to do in order to get the expected result in our app.
Significant Location Updates - is good to wake your app up once it gets finished by some reason that you can't control, so even if you lose some points, it will get back in some seconds/minutes. This is not good if you need a good accuracy, as you cannot control the distance / time or whatever, iOS will update locations when mobile antenna is changed, wifi connection, turn air plane mode off and on but will not give a sequence of gps points.
Start Location Updates - Best accuracy but battery drainer. So you can't just turn it on let it go. You must implement some controls over it.
Background tasks - The only way I've found to keep my app alive.
The way you can combine is:
didUpdateLocations
you can create your logic to start and stop your background tasks;kCLLocationAccuracyBestForNavigation
for accuracy as when it starts it eat a LOT of resources, most of time, kCLLocationAccuracyBest
is more then enough and if you can use kCLLocationAccuracyNearestTenMeters
;didUpdateLocations
will give you mostly a bunch of points, try to get only those with good horizontalAccuracy
, around 20 meters for us was good enough, so let it work and once you have a point with good accuracy, you can pause it again.Below you have some links that helped me a lot to implement our solution, none of those have a "as is" solution, as I said, I had to mix all of them and test a lot to understand its behaviour and make the necessary adjustments.
https://github.com/voyage11/Location
http://mobileoop.com/background-location-update-programming-for-ios-7
Upvotes: 1
Reputation: 3064
In addition to Mark's answer I would like you to explore pausesLocationUpdatesAutomatically
which can help you save battery from draining when user has stopped Apple Documentation
Allowing the location manager to pause updates can improve battery life on the target device without sacrificing location data. When this property is set to true, the location manager pauses updates (and powers down the appropriate hardware) at times when the location data is unlikely to change. For example, if the user stops for food while using a navigation app, the location manager might pause updates for a period of time. You can help the determination of when to pause location updates by assigning a value to the activityType property.
Upvotes: 0
Reputation: 1181
Even though you will receive more triggers than you need, as you already said, you can use startMonitoringSignificantLocationChanges
. It is implemented in a very energy efficient way. It allows the app to be terminated and only be woken up again when iOS thinks the device has moved significantly. Another advantage would be that your app doesn't need the location background mode, which could raise questions during an app review.
The startUpdatingLocation
let's the app continuously update the location of the device, even though you only receive a couple didUpdateLocations:
events. Also, iOS cannot shutdown the app while updating is active, so it consumes a lot of battery.
You can also consider geofencing, with an exit geofence around the current location. However, significant location updates will be more reliable. Exit geofences won't trigger anymore once you're already out of a geofence, which could happen when the phone is turned off inside a geofence and turned back on outside. This solution has the same advantage of not needing a background mode.
As far as I understand your use case, startMonitoringSignificantLocationChanges
sounds as the best option. You won't have control over the exact time interval and distance it triggers, but it is very energy efficient and easy to use.
Upvotes: 1