iOS mapKit refresh direction when the user's current location is updated - ios

I am developing an application that allows the user to show the itinerary from the current location to the destination.
The itinerary must be refreshed when the user's current location changes.
I am using the LocationManager to detect the current location.
When the current location changes, i re-fetch the directions and display a new itinerary that starts from the new current location.
Is there a better and cleaner solution to achieve this ? Thanks.

What you are doing is correct way. Use following method of CLLocationManagerDelegate
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
}
to get location update and chage the display accordingly.

Related

In iOS is there a way to simulate a Geographical region crossing when app is installed while within location

In my app, I am using the Boundary-Crossing Events for a Geographical Region to determine if a user has visited a location. This is working as expected when users have installed the app prior to visiting the location, however some users will be installing the app while they are at the event, and therefore are already within the location when the event is installed and so iOS does not treat this as a boundary crossing.
Is there a way to force iOS to trigger the locationManager:didEnterRegion method if the startMonitoringForRegion method is called while the device is currently within the region to monitor?
In iOS7, you can use requestStateForRegion: method of the CLLocationManager class to check whether the user is already inside a fence.
You need to implement below delegate method to receive the event.
- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
}
Thanks to this article for the answer (as well as a solution for iOS version < 7: http://hayageek.com/ios-geofencing-api/

Significant location change

I have tried the significant location change in the latest iOS 8 update but the Core Location manager method
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
is never called.
When using method startUpdatingLocation the method above is called.
Everything worked in iOS 7 for the app. I need to update to iOS 8.
Share your experience.
I'm going to guess that you're not following the instructions here:
https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_class/index.html#//apple_ref/occ/instm/CLLocationManager/startMonitoringSignificantLocationChanges
Events are going to be accumulated while your app is not running. Your app launches and must immediately create a location manager and start significant location updates all over again in order to receive that accumulated information.
If you are updating to iOS 8 be sure to make the changes in the property list (.plist) file: NSLocationWhenInUseUsageDescription and/or NSLocationAlwaysUsageDecription : http://matthewfecher.com/app-developement/getting-gps-location-using-core-location-in-ios-8-vs-ios-7/

Delay app until the user allows or disallows current location

Is there a way to delay code from running until the user has answered the current location prompt? My app fetches annotations and puts them on the map. When the app launches for the first time and the user allows current location it fails to fetch any annotations because the code already ran without receiving a current location. Thanks in advance.
You can implement the following CLLocationManagerDelegate method:
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
and only show your annotations after that method is called. It will be called when the user accepts or rejects the current location prompt.

What location manager is offering as its recent value

I asked a question regarding how to get old location from this:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
And I got reply
You should create and use a mutable array of previous
locations that were updated from previous calls to "locationManager:
didUpdateLocations:".
Link
Now I am confused regarding that in Location Awareness guide Apple says this:
If a location update has already been delivered, you can also get the
most recent location data directly from the CLLocationManager object
without waiting for a new event to be delivered.
I am not getting this point. Please help me out.
If you look at Apple's documentation for CLLocationManager, you'll see it has a property you can access that's named "location".
This property contains the last reported location data.
And whenever new locations gets resolved & reported, that property should presumably be updated.
In general though, you'll want to keep your users up-to-date on the current location via updates passed through the delegate methods.

CLLocation- user location is lost (zero lat and long) on App resume

GPS signal is lost when App is resumed from long time suspend mode.
And/or after user goes into a building where GPS is weak and then resumes the App.
The blue dot disappears and the map is centered at lat:0 long:0 ( which is somewhere in
the ocean near Nigeria-Africa )
If you launch another GPS app at that point in time, such as Apple Maps,
you DO see the blue dot, even if not so accurate.
The only way a user can fix it - is by killing my app completely and start it again.
It happens on both iOS 5.x and iOS 6.x.
Before going into details, I would really like to ask:
Does anyone encounter this problem ??
Its very annoying but, I couldn't find anyone complaining about this
anywhere on the web - very weird.
I'm using normal CLLocation with showUserLocation=YES,
Nothing magical, no special accuracy tuning or whatever, just simple default
implementation.
I have already tried restarting every possible component when App is resumed;
showUserLocation=NO;
showUserLocation=YES;
or
[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];
or
even releasing locationManager and initialize it again doesn't help!
( also tried restarting it with a delay using dispatch_after )
Is there any programmatic way to force RESET the GPS signal or CLLocation in ios ?
Will appreciate any relevant discussion!
I Think you default Location is set "None" so this type of issue created.
Go to
Edite Scheme..
|
|
"Run YourProjectName" / Left Hand Side
|
|
Select "Option" Tab
|
|
Default Location
|
|
Choose any Location such like , "London England"
When you say that you've tried stopping/starting the CLLocationManager object, are you saying that the call-back you get in your delegate gives you a 0,0 coordinate, or are you trying to access the location directly using the location property in CLLocationManager?
I work on a location based app and one thing I can tell you is that you cannot count of directly getting the location of a CLLocationManager object. The only reliable way to get location information is to rely on the callback of the CLLocationManager class by implementing
-(void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
The way I handle CLLocationManager in my app (now I'm not saying this is optimal or ideal for your use case but it does allow us to provide a solid location-based experience to the user on app launch/resume)
Wrap the CLLocationManager into a location management class (usually using a singleton) - I think this can be a subclass of CLLocationManager but in my case it's just a subclass of NSObject with a CLLocationManager object as a property
Store the last known valid location in this singleton, and then write it to disk (NSUserDefaults or another location - need to re-check if you're allowed to store user location in NSUserDefaults but we've done it in our app and doesn't seem to affect the approval process)
Re-implement a way to get the current location in your custom class - basically check if CLLocationManager is returning 0,0 and if it is, return your cached position instead
Not strictly necessary but if you have multiple views/pages that need to use the location, implementing the observer model works well (since your singleton is now CLLocationManager's delegate, you need to have a way to pass this information on to your view controllers).
With the above, on my map page (or wherever I'm displaying user location) - I basically update the map with the cached location once (in viewDidLoad) and then I allow one update to the map through the delegate-callback. Once that call-back is received, I then set showsUserLocation to YES (if the call-back isn't called, then you don't have a valid location yet and so setting showsUserLocation at that point doesn't do anything).
I hope this helps and feel free to let me know if you have any further questions!

Resources