summaryrefslogtreecommitdiff
path: root/platform/darwin
diff options
context:
space:
mode:
authorFabian Guerra Soto <fabian.guerra@mapbox.com>2018-07-20 14:14:43 -0700
committerGitHub <noreply@github.com>2018-07-20 14:14:43 -0700
commit681e0141de63d0d5a545e87c40216163b2d63fc6 (patch)
tree0253e9980ca3c8a75d8f2e04dae8d69f1ef667bd /platform/darwin
parentbbccce18c4d064054726f66e0b9b41cebfe314e4 (diff)
downloadqtlocation-mapboxgl-681e0141de63d0d5a545e87c40216163b2d63fc6.tar.gz
[ios] Mapbox's Location Manager new API. (#12013)
* [ios] The new location manager API provides two new protocols MGLLocationManager and MGLLocationManagerDelegate to handle the location cycle and updates respectively. This enables developers to chose the appropriate location provider according to their needs, or transition between outdoors/indoors location updates. It does provide a default implementation based on CLLocationManager.
Diffstat (limited to 'platform/darwin')
-rw-r--r--platform/darwin/src/MGLLocationManager.h181
-rw-r--r--platform/darwin/src/MGLLocationManager.m116
-rw-r--r--platform/darwin/src/MGLLocationManager_Private.h5
3 files changed, 302 insertions, 0 deletions
diff --git a/platform/darwin/src/MGLLocationManager.h b/platform/darwin/src/MGLLocationManager.h
new file mode 100644
index 0000000000..121dcc2293
--- /dev/null
+++ b/platform/darwin/src/MGLLocationManager.h
@@ -0,0 +1,181 @@
+#import <Foundation/Foundation.h>
+#import <CoreLocation/CoreLocation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol MGLLocationManagerDelegate;
+
+/**
+ The `MGLLocationManager` protocol defines a set of methods that a class must
+ implement in order to serve as the location manager of an `MGLMapView`. A location
+ manager is responsible for notifying the map view about location-related events,
+ such as a change in the user’s location. This protocol is similar to the
+ Core Location framework’s `CLLocationManager` class, but your implementation
+ does not need to be based on `CLLocationManager`.
+
+ */
+@protocol MGLLocationManager <NSObject>
+
+@optional
+
+#pragma mark Configuring Location Update Precision
+
+/**
+ Specifies the minimum distance (measured in meters) a device must move horizontally
+ before a location update is generated.
+
+ The default value of this property is `kCLDistanceFilterNone` when `MGLMapView` uses its
+ default location manager.
+
+ @see `CLLocationManager.distanceFilter`
+ */
+@property(nonatomic, assign) CLLocationDistance distanceFilter;
+
+/**
+ Specifies the accuracy of the location data.
+
+ The default value is `kCLLocationAccuracyBest` when `MGLMapView` uses its
+ default location manager.
+
+ @note Determining a location with greater accuracy requires more time and more power.
+
+ @see `CLLocationManager.desiredAccuracy`
+ */
+@property (nonatomic, assign) CLLocationAccuracy desiredAccuracy;
+
+/**
+ Specifies the type of user activity associated with the location updates.
+
+ The location manager uses this property as a cue to determine when location updates
+ may be automatically paused.
+
+ The default value is `CLActivityTypeOther` when `MGLMapView` uses its
+ default location manager.
+
+ @see `CLLocationManager.activityType`
+ */
+@property (nonatomic, assign) CLActivityType activityType;
+
+@required
+
+/**
+ The delegate to receive location updates.
+
+ Do not set the location manager’s delegate yourself. `MGLMapView` sets this property
+ after the location manager becomes `MGLMapView`’s location manager.
+ */
+@property (nonatomic, weak) id<MGLLocationManagerDelegate> delegate;
+
+#pragma mark Requesting Authorization for Location Services
+
+/**
+ Returns the current localization authorization status.
+
+ @see `+[CLLocationManger authorizationStatus]`
+ */
+@property (nonatomic, readonly) CLAuthorizationStatus authorizationStatus;
+
+/**
+ Requests permission to use the location services whenever the app is running.
+ */
+- (void)requestAlwaysAuthorization;
+
+/**
+ Requests permission to use the location services while the app is in
+ the foreground.
+ */
+- (void)requestWhenInUseAuthorization;
+
+#pragma mark Initiating Location Updates
+
+/**
+ Starts the generation of location updates that reports the user's current location.
+ */
+- (void)startUpdatingLocation;
+
+/**
+ Stops the generation of location updates.
+ */
+- (void)stopUpdatingLocation;
+
+#pragma mark Initiating Heading Updates
+
+/**
+ Specifies a physical device orientation.
+ */
+@property (nonatomic) CLDeviceOrientation headingOrientation;
+
+/**
+ Starts the generation of heading updates that reports the user's current hading.
+ */
+- (void)startUpdatingHeading;
+
+/**
+ Stops the generation of heading updates.
+ */
+- (void)stopUpdatingHeading;
+
+/**
+ Dissmisses immediately the heading calibration view from screen.
+ */
+- (void)dismissHeadingCalibrationDisplay;
+
+@end
+
+/**
+ The `MGLLocationManagerDelegate` protocol defines a set of methods that respond
+ to location updates from an `MGLLocationManager` object that is serving as the
+ location manager of an `MGLMapView`.
+ */
+@protocol MGLLocationManagerDelegate <NSObject>
+
+#pragma mark Responding to Location Updates
+
+/**
+ Notifies the delegate with the new location data.
+
+ @param manager The location manager reporting the update.
+ @param locations An array of `CLLocation` objects in chronological order,
+ with the last object representing the most recent location. This array
+ contains multiple `CLLocation` objects when `MGLMapView` uses its
+ default location manager.
+ */
+- (void)locationManager:(id<MGLLocationManager>)manager
+ didUpdateLocations:(NSArray<CLLocation *> *)locations;
+
+#pragma mark Responding to Heading Updates
+
+/**
+ Notifies the delegate with the new heading data.
+
+ @param manager The location manager reporting the update.
+ @param newHeading The new heading update.
+ */
+- (void)locationManager:(id<MGLLocationManager>)manager
+ didUpdateHeading:(CLHeading *)newHeading;
+
+/**
+ Asks the delegate if the calibration alert should be displayed.
+
+ @param manager The location manager reporting the calibration.
+ */
+- (BOOL)locationManagerShouldDisplayHeadingCalibration:(id<MGLLocationManager>)manager;
+
+#pragma mark Responding to Location Updates Errors
+
+/**
+ Notifies the delegate that the location manager was unable to retrieve
+ location updates.
+
+ @param manager The location manager reporting the error.
+ @param error An error object containing the error code that indicates
+ why the location manager failed.
+ */
+- (void)locationManager:(id<MGLLocationManager>)manager
+ didFailWithError:(nonnull NSError *)error;
+
+@optional
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/darwin/src/MGLLocationManager.m b/platform/darwin/src/MGLLocationManager.m
new file mode 100644
index 0000000000..29e3ccaa30
--- /dev/null
+++ b/platform/darwin/src/MGLLocationManager.m
@@ -0,0 +1,116 @@
+#import "MGLLocationManager_Private.h"
+
+@interface MGLCLLocationManager()<CLLocationManagerDelegate>
+
+@property (nonatomic) CLLocationManager *locationManager;
+
+@end
+
+@implementation MGLCLLocationManager
+
+- (instancetype)init
+{
+ if (self = [super init]) {
+ _locationManager = [[CLLocationManager alloc] init];
+ _locationManager.delegate = self;
+ }
+ return self;
+}
+
+@synthesize delegate;
+
+- (void)setHeadingOrientation:(CLDeviceOrientation)headingOrientation
+{
+ self.locationManager.headingOrientation = headingOrientation;
+}
+
+- (CLDeviceOrientation)headingOrientation
+{
+ return self.locationManager.headingOrientation;
+}
+
+- (void)setDesiredAccuracy:(CLLocationAccuracy)desiredAccuracy {
+ self.locationManager.desiredAccuracy = desiredAccuracy;
+}
+
+- (CLLocationAccuracy)desiredAccuracy {
+ return self.locationManager.desiredAccuracy;
+}
+
+- (CLAuthorizationStatus)authorizationStatus {
+ return [CLLocationManager authorizationStatus];
+}
+
+- (void)setActivityType:(CLActivityType)activityType {
+ self.locationManager.activityType = activityType;
+}
+
+- (CLActivityType)activityType {
+ return self.locationManager.activityType;
+}
+
+- (void)dismissHeadingCalibrationDisplay {
+ [self.locationManager dismissHeadingCalibrationDisplay];
+}
+
+- (void)requestAlwaysAuthorization {
+ [self.locationManager requestAlwaysAuthorization];
+}
+
+- (void)requestWhenInUseAuthorization {
+ [self.locationManager requestWhenInUseAuthorization];
+}
+
+- (void)startUpdatingHeading {
+ [self.locationManager startUpdatingHeading];
+}
+
+- (void)startUpdatingLocation {
+ [self.locationManager startUpdatingLocation];
+}
+
+- (void)stopUpdatingHeading {
+ [self.locationManager stopUpdatingHeading];
+}
+
+- (void)stopUpdatingLocation {
+ [self.locationManager stopUpdatingLocation];
+}
+
+- (void)dealloc
+{
+ [self.locationManager stopUpdatingLocation];
+ [self.locationManager stopUpdatingHeading];
+ self.locationManager.delegate = nil;
+ self.delegate = nil;
+}
+
+#pragma mark - CLLocationManagerDelegate
+
+- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
+ if ([self.delegate respondsToSelector:@selector(locationManager:didUpdateLocations:)]) {
+ [self.delegate locationManager:self didUpdateLocations:locations];
+ }
+}
+
+- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
+ if ([self.delegate respondsToSelector:@selector(locationManager:didUpdateHeading:)]) {
+ [self.delegate locationManager:self didUpdateHeading:newHeading];
+ }
+}
+
+- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager {
+ if ([self.delegate respondsToSelector:@selector(locationManagerShouldDisplayHeadingCalibration:)]) {
+ return [self.delegate locationManagerShouldDisplayHeadingCalibration:self];
+ }
+
+ return NO;
+}
+
+- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
+ if ([self.delegate respondsToSelector:@selector(locationManager:didFailWithError:)]) {
+ [self.delegate locationManager:self didFailWithError:error];
+ }
+}
+
+@end
diff --git a/platform/darwin/src/MGLLocationManager_Private.h b/platform/darwin/src/MGLLocationManager_Private.h
new file mode 100644
index 0000000000..4f09405e71
--- /dev/null
+++ b/platform/darwin/src/MGLLocationManager_Private.h
@@ -0,0 +1,5 @@
+#import "MGLLocationManager.h"
+
+@interface MGLCLLocationManager : NSObject<MGLLocationManager>
+
+@end