[ios] Mapbox's Location Manager new API. #12013
Changes from all commits
5959462
16ac785
6d87719
958a744
720bb19
4cfbc74
49078d9
7d826ec
428a99a
5ff6d16
acf3eaf
ba2a196
65a788d
3bec307
efad42d
fbd8066
f1445cb
6ffc828
2d60067
a6cd73c
741dd3c
f01e324
08b4727
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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]` | ||
This comment was marked as resolved.
Sorry, something went wrong. |
||
*/ | ||
@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 |
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,116 @@ | ||||||||||||||
#import "MGLLocationManager_Private.h" | ||||||||||||||
|
||||||||||||||
@interface MGLCLLocationManager()<CLLocationManagerDelegate> | ||||||||||||||
|
||||||||||||||
@property (nonatomic) CLLocationManager *locationManager; | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why create a default location manager that owns a CLLocationManager? Why not extend CLLocationManager to conform to MGLLocationManager? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Te reason for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suppose we instead declare a category on CLLocationManager that conforms to MGLLocationManager. Wouldn’t that accomplish the same thing as this class, except with less indirection? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You're right. I changed the implementation accordingly. |
||||||||||||||
|
||||||||||||||
@end | ||||||||||||||
|
||||||||||||||
@implementation MGLCLLocationManager | ||||||||||||||
|
||||||||||||||
- (instancetype)init | ||||||||||||||
{ | ||||||||||||||
if (self = [super init]) { | ||||||||||||||
_locationManager = [[CLLocationManager alloc] init]; | ||||||||||||||
_locationManager.delegate = self; | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We'll need a
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The mapbox-gl-native/platform/darwin/src/MGLLocationManager.m Lines 80 to 85 in 4097257
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh! nvm you are saying that the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||||||||||||||
} | ||||||||||||||
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 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#import "MGLLocationManager.h" | ||
|
||
@interface MGLCLLocationManager : NSObject<MGLLocationManager> | ||
|
||
@end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#import <UIKit/UIKit.h> | ||
|
||
@interface MBXCustomLocationViewController : UIViewController | ||
|
||
@end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider adding this protocol and MGLLocationManagerDelegate to the jazzy table of contents.