IPhone and Location(1)Documents User Location
IPhone and Location(1)Documents User Location
1. Introduce Location and Map
Getting the User's Location
Region Monitoring
Geocoding Location Data
iBeacons Enhance the User's Experience of a Location
Heading Information Indicates the User's Current Orientation - magnetometer
1.1 Getting the User's Location
Core Location Framework
a. The significant-change location service provides a low-power way to get the current location and be notified.
b. The standard location service
c. Region monitoring, monitor boundary crossings for defined geographical regions and Bluetooth low energy beacon regions.
Linking to a Library or Framework
Select the Project-----> Select Targets -----> Build Phases-----> Link Binary With Libraries----> Click on +
#import <CoreLocation/CoreLocation.h>
Requiring the Presence of Location Services in Order to Run
Info.plist
UIRequiredDeviceCapabilities= array of strings?
a. location-services string if you require location services in general.
b. gps string if your app requires the accuracy offered only by GPS hardware.
Getting the User's Current Location
The core location framework uses information obtained from the built-in cellular, Wi-Fi or GPS hardware to triangulate a location.
standard location service
significant-change location service
Gathering location data is power-intensive operation.?
Power up the onboard radios and querying the available cell towers, Wi-Fi hotspots, or GPS satellites. Leaving the standard location service running for extended periods can drain the device's battery.
The significant-change location service reduces battery drain by monitoring only cell tower changes.
Determining Whether Location Services Are Available
a. The user can disable location Services in the App Settings
b. The user can deny location services for a specific app.
c. The device might be in Airplane mode and unable to power up the necessary hardware.
We call CLLocationManager.locationServicesEnabled to check that.
Starting the Standard Location Service
Create an instance of CLLocationManager, configure desiredAccuracy and distanceFilter.
Assign a delegate to the object and call the startUpdatingLocation.
To stop the delivery of location updates, call stopUpdatingLocation.
-(void)startStandardUpdates{
? ? ?if(nil == locationManager)
? ? ? ? ? locationManager = [[CLLocationManager alloc] init];
? ? ?locationManager.delegate = self;
? ? ?locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
? ? ?locationManager.distanceFilter = 500; //meters
? ? ?[locationManager startUpdatingLocation];
}
Starting the Significant-Change Location Service
create an instance of the CLLocationManager, assign a delegate to it, call the startMonitoringSignificantLocationChanges
-(void) startSignificantChangeUpdates{
? ? ?if(nil == locationManager){
? ? ? ? ? locationManager = [[CLLocationManager alloc]init];
? ? ?}
? ? ?locationManager.delegate = self;
? ? ?[locationManager startMonitoringSignificantLocationChanges];
}
stopMonitoringSignificantLocationChanges to stop the service.
If we leave this service running and our app is suspended or terminated, the service automatically wakes up our app when new location data arrives.?
At wake-up time, our app is put into the background and given a small amount of time(10 seconds) to process the location data. Our app is in the background and should do minimal work and avoid any tasks(such as querying the networks).If the time expires, our app may be terminated.
If we need more time, we need to request more time using the beginBackgroundTaskWithExpirationHandler, end the task by calling the endBackgroundTask
Receiving Location Data from a Service
locationManager:didUpdateLocations
Sometimes, location manager returns cached events, so we need to check the timestamp of any location events we receive.
-(void) locationManager:(CLLocationManager *)manager
? ? ?didUpdateLocations:(NSArray *)locations {
? ? ?CLLocation* location = [locations lastObject];
? ? ?NSDate* eventDate = location.timestamp;
? ? ?NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
? ? ?if(abs(howRecent) < 15.0){
? ? ? ? ? NSLog(@"latitude %+.6f, longitude %+.6f\n", location.coordinate.latitude, location.coordinate.longitude);
? ? ?}
}
Getting Location Events in the Background
Declare our app as needing background location services by including the UIBackgroundModes in Info.plist.
When an app is in the background and the location data is unlikely to change, in iOS 6.0 and later the location manager pauses the delivery of location updates to its delegate and powers down the hardware. After the user launches the app or when the user begins the activity again, the location manager resumes delivering location updates.
How to pause is decided by activityType, for example CLActivityTypeAutomotiveNavigation.
When the location manager pauses location updates, it calls the locationManagerDidPauseLocationUpdates
When the location manager resume location updates, it calls the locationManagerDidResumeLocationUpdates
If your paused, background app is terminated by the user or if it is terminated by the system to free up memory for the current foreground app, location updates will not resume automatically the next time the app is launched.
Deferring Location Updates While in the Background
deferredLocationUpdatesAvailable on CLLocationManager to see if the device support this.
-(void)locationManager:(CLLocationManager *)manager
? ? ?didUpdateLocations:(NSArray *)locations {
? ? ?[self.hike addLocations:locations];
? ? ?
? ? ?if(!self.defferingUpdates){
? ? ? ? ? CLLocationDistance distance = self.hike.goal - self.hike.distance;
? ? ? ? ? NSTimeInterval time = [self.nextAudible timeIntervalSinceNow];
? ? ? ? ? [locationManager allowDeferredLocationUpdatesUntilTraveled:distance
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?timeout:time];
? ? ? ? ? self.defferingUpdates = YES;
? ? ?}
}
Tips for Conserving Battery Power
…snip...
References:
Location and Maps Guide
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497-CH1-SW1
API book
https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CoreLocation_Framework/_index.html#//apple_ref/doc/uid/TP40007123
sample
https://developer.apple.com/library/ios/search/?q=location+sample
tips
http://www.cocoachina.com/special/fornew.html
https://developer.apple.com/library/ios/recipes/xcode_help-project_editor/Articles/AddingaLibrarytoaTarget.html#//apple_ref/doc/uid/TP40010155-CH17
Guide
https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Getting%20Started