I'm currently writing a Mobile iOS app that is using the iOS Significant Location Change service to manage lots and lots of geofences, enabling and disabling geofences as we receive this message from the CoreLocation Framework.
On the Apple Developer Website it says:
The significant-change location service delivers updates only when there has been a significant change in the device’s location, such as 500 meters or more.
What really throws me off is "500 meters or more", what exactly is the significant location change service based on and what guarantees do we actually have?
Is this API reliable for tracking changes between regions so that when we receive the message we know it's time to redistribute our geofences (assuming we have less than 20 geofences per 500 meter radius)?
I made an experiment running a small app using significant location change API for two weeks on 10 real-user devices (so they were traveling to work, going home, going out in the weekend, etc.) The test run in a metropolitan environment (Milan, Italy). There were approximately 1800 significant location update events registered.
The core results are:
- There are approximately 10 location updates per day in average
- The horizontal accuracy stated by CoreLocation has the distribution as shown in the table bellow
- This does not guarantee however that once the user moves out from the circle defined by the last location update and its horizontal accuracy CoreLocation will send a new location event. In other words you can't be sure that the user is in this circle at any given moment.
- If some other app uses the GPS on the device (during navigation for example), the location events arriving to my app were also much more accurate.
The distribution table should be read as follows: the first column is the horizontal accuracy in meters, the second column is that how many % of the location updates were equal or more accurate then the first column.
Accuracy Cumulative distribution
10m 23.76%
20m 23.76%
50m 23.76%
100m 49.86%
200m 65.09%
400m 65.31%
500m 65.31%
1000m 68.66%
2000m 92.64%
4000m 97.82%
>4000m 100.00%
So in other words, almost 2/3 part of the location updates were more accurate then 200m.
500 meters is .31 miles - about a 3rd of a mile. They don't specify how exact it is, but based on tests while using GPS and the core location framework, it's very accurate (it should be tracking distance foot by foot even if startupdatinglocation method is not called in code).