CoreLocation : efficient way to keep track user's location - ios

what's the efficient way to keep track user's location? I mean I do not care if the location has been change slightly, because it will waste the resources.
i used in my code: LocationManager.stopUpdatingLocation()
to stop every small changes in location...
is there a way to keep track the location only if it oldLocation and newLocation has big different?

Yes there are two ways you can achieve that. First way is to use
func startMonitoringSignificantLocationChanges()
startMonitoringSignificantLocationChanges starts the generation of updates based on significant location changes. Apps can expect a notification as soon as the device moves 500 meters when you are using startMonitoringSignificantLocationChanges. And if you want to use startUpdatingLocation then set distanceFilter to distance of your choice and it will report location only if location change is more than distance specified in filter. distanceFilter represents the minimum distance (measured in meters) a device must move horizontally before an update event is generated.

Related

Get accurate location in iOS

I set the location accuracy with this setting:
locationManager.desiredAccuracy = kCLLocationAccuracyBest
And I get the location with this:
if let location = locations.first {
....
}
But it updates location several times and many of them are not accurate. For example when I find the location, it's about 100 meter away from the device location.
How do I get an accurate location?
I know that the first few locations are not accurate until the device gets a fix on the location.
From the documentation:
The receiver does its best to achieve the requested accuracy; however,
the actual accuracy is not guaranteed.
Because of this, you can't guarantee how close the detected locations are, but there are a couple of other things that you could try:
Use kCLLocationAccuracyBestForNavigation. This should get you a more accurate reading, but with the cost of more battery usage.
Filter the locations, though I don't know if this is even possible, because the only data you have is what was received from the location manager that you are using.
From experience over the years with core location. It takes sometime for the GPS chip to "Warm up" and sometimes reports several locations before getting a lock on. You will experience this more indoors rather than with clear view of the sky. Buildings with metal roofs also effect the accuracy. You can however ignore gps updates if they are in/out of a certain threshold using distanceFilter property (Specified in meters) distanceFilter and setting desired accuracy using this property also horizontalAccuracy.
You can check accuracy for every update you get, and filter locations until they get to reliable accuracy:
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(manager.location!.horizontalAccuracy)
if locations.last!.horizontalAccuracy <= manager.desiredAccuracy{
print(manager.location)
}
}
Take a look at the horizontalAccuracy property of the location (CLLocation). This is measured in meters. You can use this property to disregard location readings which are not accurate enough.

Whats the sample frequency of iPhones velocimeter?

I'm developing an iOS app that needs precision velocimeter data capturing. For that i need to know what are the maximum sample frequency of iOS devices velocimeters. Couldn't find that on devices especifications or anywhere.
Please help
So the speed gets calculated from distance and time, there is not a real frequency.
The CLLocation speed attribute gets updated every time your device is moving.
It means, even when you looking for the object every millisecond, you only get the last calculated coordinate.
Update
https://developer.apple.com/reference/corelocation/cllocationmanager/1423500-distancefilter
This distance is measured relative to the previously delivered location. Use the value kCLDistanceFilterNone to be notified of all movements. The default value of this property is kCLDistanceFilterNone.
This property is used only in conjunction with the standard location services and is not used when monitoring significant location changes.
So I think this means, that the frequency is depending on the gps signal it self.
https://en.wikipedia.org/wiki/GPS_signals

how ios core location distance filter work?

I am using a CLLocationManager to get the location data in my ios app, I am using locationManager.distanceFilter method to update how often I want to update my location.
Does this method record the location every time the device moves at least that much of distance? and what happens if it is set to 0? will it update the location even if the location is not changing?
Any help would be appreciated.
With the distance filter set to 0 you should get new location about every 1 second. All of them will be slightly different even if you are not moving because GPS/GLONASS accuracy is not perfect. If you set it to some bigger value next location will be reported only when the distance between locations will be greater than specified value.

MapView CLLocationManager always giving new location for the same place

I am using CLLocationManager didUpdateLocations to get current location of device.
Its provide me the current location but after in few seconds I am getting different latitude and longitude for the same place with no movement in device.
I want to implement 5 metre distance check in my app, but due to frequently change in location provided by delegate method I always getting the more than 5 meter difference between old and new location.
Can anybody suggest what is the best way to find out accurate distance.

why did didupdatelocation be called when device is not moved

i use CLLocation for a app that record people's trace in map view when they are running or walking ,but i found when my device is still (not moved) ,the
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations is also get called frequently ?
currently ,my locationmanager's desiredAccuracy is 10 meters and distanceFilter is 10.
how to deal with this situation? I have tried use big distancefilter value(like 150) ,but I found if i do this, then i can't record exactly when people is running or walking
GPS is not exact. You can move around a few feet and get the same location. Or you can sit still and get told you have moved a few feet.
You might be able to combine measurements from the accelerometer to determine if you have really moved but this would only work if the device was sitting on a table not moving.
Have you called stopUpdatingLocation after the initial startUpdatingLocation? It will keep updating location if you do not call it.
How does system know whether or not you have actually moved? It MUST fetch your location to find out. The more accurate your desired accuracy is, the more vigorously and frequently it would look. By vigorous I mean if it's suppose to use cell-tower information then it would look into more cell-towers to better triangulate. Or simply put it, the interval between its fetches would be smaller. Concluding: OS would fetch data even if you don't move.
Additionally to triangulate your position the OS (depending on your desiredAccuracy and previous movements) would use a mix of GPS, wifi, Cell-tower. And because someone may all of sudden turn off/on their wifi, or satellite that you were using to get your location has moved a bit or the satellites have changed, or a cell-tower signal may become more or less accurate due to its bandwidth limitations then your calculated location may change which triggers a callback if it's more than your distanceFilter. ( I don't believe you get callbacks for less than your distanceFilter, but I may be wrong) This likely means your distanceFilter is set to very small number which depending on your business requirements may or may not be a good choice. Concluding: your location is never ever 100% accurate
The result of periodical fetching, possibility of error and small distanceFilters lead to possible incorrect locationChanges.

Resources