summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Guerra <fabian.guerra@mapbox.com>2018-06-26 11:49:28 -0700
committerFabian Guerra <fabian.guerra@mapbox.com>2018-07-20 09:46:38 -0700
commita4388ae6f57bc6515332d697dc1164041e0d8805 (patch)
tree132916170bd766ee46eaa4ee30d836ba670ed9d7
parent0c747d14337f8ed60f4d7e5b34ba4afa79f67352 (diff)
downloadqtlocation-mapboxgl-a4388ae6f57bc6515332d697dc1164041e0d8805.tar.gz
[ios] Add a custom location manager example.
-rw-r--r--platform/ios/app/MBXCustomLocationViewController.h5
-rw-r--r--platform/ios/app/MBXCustomLocationViewController.m168
-rw-r--r--platform/ios/app/MBXViewController.m7
-rw-r--r--platform/ios/app/Main.storyboard16
-rw-r--r--platform/ios/app/simple_route.json184
-rw-r--r--platform/ios/ios.xcodeproj/project.pbxproj10
-rw-r--r--platform/ios/src/MGLMapView.mm2
7 files changed, 391 insertions, 1 deletions
diff --git a/platform/ios/app/MBXCustomLocationViewController.h b/platform/ios/app/MBXCustomLocationViewController.h
new file mode 100644
index 0000000000..ae6c14fe2c
--- /dev/null
+++ b/platform/ios/app/MBXCustomLocationViewController.h
@@ -0,0 +1,5 @@
+#import <UIKit/UIKit.h>
+
+@interface MBXCustomLocationViewController : UIViewController
+
+@end
diff --git a/platform/ios/app/MBXCustomLocationViewController.m b/platform/ios/app/MBXCustomLocationViewController.m
new file mode 100644
index 0000000000..037ccef10d
--- /dev/null
+++ b/platform/ios/app/MBXCustomLocationViewController.m
@@ -0,0 +1,168 @@
+#import "MBXCustomLocationViewController.h"
+
+#import <Mapbox/Mapbox.h>
+
+@interface MBXCustomLocationManager : NSObject<MGLLocationManager>
+@end
+
+@interface MBXCustomLocationManager()
+
+@property (nonatomic) CLLocationManager *locationManager;
+@property (nonatomic, strong) NSTimer *locationUpdateTimer;
+@property (nonatomic) NSUInteger index;
+@property (strong, nonatomic) NSDictionary *routeCoordinates;
+@property (strong, nonatomic) NSArray *coordinates;
+
+@end
+
+@implementation MBXCustomLocationManager
+
+@synthesize delegate;
+
+- (instancetype)init
+{
+ if (self = [super init]) {
+ _locationManager = [[CLLocationManager alloc] init];
+ _index = 0;
+ }
+ return self;
+}
+
+- (CLAuthorizationStatus)authorizationStatus
+{
+ return [CLLocationManager authorizationStatus];
+}
+
+- (void)setHeadingOrientation:(CLDeviceOrientation)headingOrientation
+{
+ _locationManager.headingOrientation = headingOrientation;
+}
+
+- (CLDeviceOrientation)headingOrientation
+{
+ return _locationManager.headingOrientation;
+}
+
+- (void)requestAlwaysAuthorization
+{
+ [self.locationManager requestAlwaysAuthorization];
+}
+
+- (void)requestWhenInUseAuthorization
+{
+ [self.locationManager requestWhenInUseAuthorization];
+}
+
+- (void)startUpdatingHeading
+{
+ [self.locationManager startUpdatingHeading];
+}
+
+- (void)startUpdatingLocation
+{
+ [self loadRouteCoordinates];
+ self.locationUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:0.8
+ target:self
+ selector:@selector(updateLocation)
+ userInfo:nil
+ repeats:YES];
+}
+
+- (void)stopUpdatingHeading
+{
+ [self.locationManager stopUpdatingHeading];
+}
+
+- (void)stopUpdatingLocation
+{
+ [self.locationUpdateTimer invalidate];
+ self.locationUpdateTimer = nil;
+}
+
+- (void)dismissHeadingCalibrationDisplay
+{
+ [self.locationManager dismissHeadingCalibrationDisplay];
+}
+
+- (void)dealloc
+{
+ [self.locationManager stopUpdatingLocation];
+ [self.locationManager stopUpdatingHeading];
+ self.delegate = nil;
+}
+
+#pragma mark - Location Updates
+
+- (void)loadRouteCoordinates
+{
+ NSString *filePath = [[NSBundle bundleForClass:self.class] pathForResource:@"simple_route" ofType:@"json"];
+ NSData *data = [NSData dataWithContentsOfFile:filePath];
+ _routeCoordinates = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
+ _coordinates = [self.routeCoordinates objectForKey:@"coordinates"];
+}
+
+- (void)updateLocation
+{
+ if ([self.delegate respondsToSelector:@selector(locationManager:didUpdateLocations:)]) {
+
+ if (self.index >= [self.coordinates count] ) {
+ self.index = 0;
+ self.coordinates = [[self.coordinates reverseObjectEnumerator] allObjects];
+ }
+ NSArray *loc = self.coordinates[self.index];
+ CLLocationDegrees latitude = [[loc objectAtIndex:1] doubleValue];
+ CLLocationDegrees longitude = [[loc objectAtIndex:0] doubleValue];
+ CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
+ self.index++;
+ [self.delegate locationManager:self didUpdateLocations:@[location]];
+ }
+}
+
+- (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;
+}
+
+@end
+
+@interface MBXCustomLocationViewController ()
+
+@property (strong, nonatomic) MGLMapView *mapView;
+
+@end
+
+@implementation MBXCustomLocationViewController
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds];
+
+ self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
+ MBXCustomLocationManager *mbxLocationManager = [[MBXCustomLocationManager alloc] init];
+ self.mapView.locationManager = mbxLocationManager;
+ // Set the map’s center coordinate and zoom level.
+ [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(37.788380, -122.400121)
+ zoomLevel:13
+ animated:NO];
+
+ [self.view addSubview:self.mapView];
+ self.mapView.showsUserLocation = YES;
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+ self.mapView.showsUserLocation = NO;
+}
+
+@end
diff --git a/platform/ios/app/MBXViewController.m b/platform/ios/app/MBXViewController.m
index 167f07d296..2b203b69ff 100644
--- a/platform/ios/app/MBXViewController.m
+++ b/platform/ios/app/MBXViewController.m
@@ -98,6 +98,7 @@ typedef NS_ENUM(NSInteger, MBXSettingsMiscellaneousRows) {
MBXSettingsMiscellaneousLocalizeLabels,
MBXSettingsMiscellaneousShowSnapshots,
MBXSettingsMiscellaneousShouldLimitCameraChanges,
+ MBXSettingsMiscellaneousShowCustomLocationManager,
MBXSettingsMiscellaneousPrintLogFile,
MBXSettingsMiscellaneousDeleteLogFile,
};
@@ -444,6 +445,7 @@ CLLocationCoordinate2D randomWorldCoordinate() {
[NSString stringWithFormat:@"Show Labels in %@", (_localizingLabels ? @"Default Language" : [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:[self bestLanguageForUser]])],
@"Show Snapshots",
[NSString stringWithFormat:@"%@ Camera Changes", (_shouldLimitCameraChanges ? @"Unlimit" : @"Limit")],
+ @"Show Custom Location Manager",
]];
if (self.debugLoggingEnabled)
@@ -682,6 +684,11 @@ CLLocationCoordinate2D randomWorldCoordinate() {
[self performSegueWithIdentifier:@"ShowSnapshots" sender:nil];
break;
}
+ case MBXSettingsMiscellaneousShowCustomLocationManager:
+ {
+ [self performSegueWithIdentifier:@"ShowCustomLocationManger" sender:nil];
+ break;
+ }
case MBXSettingsMiscellaneousShouldLimitCameraChanges:
{
self.shouldLimitCameraChanges = !self.shouldLimitCameraChanges;
diff --git a/platform/ios/app/Main.storyboard b/platform/ios/app/Main.storyboard
index 72c5cd013f..3e8a0ad02a 100644
--- a/platform/ios/app/Main.storyboard
+++ b/platform/ios/app/Main.storyboard
@@ -107,6 +107,7 @@
<outlet property="hudLabel" destination="58y-pX-YyB" id="aGG-7a-bZR"/>
<outlet property="mapView" destination="kNe-zV-9ha" id="VNR-WO-1q4"/>
<segue destination="zvf-Qd-4Ru" kind="show" identifier="ShowSnapshots" id="hzX-Jp-UJq"/>
+ <segue destination="dgL-Bu-te0" kind="show" identifier="ShowCustomLocationManger" id="kDM-0K-hSf"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="AAd-8J-9UU" userLabel="First Responder" sceneMemberID="firstResponder"/>
@@ -432,6 +433,21 @@
</objects>
<point key="canvasLocation" x="1365.5999999999999" y="1083.5082458770617"/>
</scene>
+ <!--Custom Location View Controller-->
+ <scene sceneID="TUi-Dc-6uA">
+ <objects>
+ <viewController id="dgL-Bu-te0" customClass="MBXCustomLocationViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="ero-1d-Jm5">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <viewLayoutGuide key="safeArea" id="t2S-ES-YuE"/>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="RtO-ic-8Nc" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="2073" y="1082"/>
+ </scene>
</scenes>
<resources>
<image name="TrackingLocationOffMask.png" width="23" height="23"/>
diff --git a/platform/ios/app/simple_route.json b/platform/ios/app/simple_route.json
new file mode 100644
index 0000000000..8b910dbdaf
--- /dev/null
+++ b/platform/ios/app/simple_route.json
@@ -0,0 +1,184 @@
+{
+ "coordinates":[
+ [
+ -122.39899,
+ 37.787357
+ ],
+ [
+ -122.398818,
+ 37.78722
+ ],
+ [
+ -122.398794,
+ 37.7872
+ ],
+ [
+ -122.398259,
+ 37.786773
+ ],
+ [
+ -122.398984,
+ 37.786206
+ ],
+ [
+ -122.399053,
+ 37.786151
+ ],
+ [
+ -122.399379,
+ 37.785888
+ ],
+ [
+ -122.399614,
+ 37.785697
+ ],
+ [
+ -122.399884,
+ 37.785478
+ ],
+ [
+ -122.400382,
+ 37.78509
+ ],
+ [
+ -122.400478,
+ 37.785015
+ ],
+ [
+ -122.400599,
+ 37.785111
+ ],
+ [
+ -122.4012,
+ 37.785587
+ ],
+ [
+ -122.401495,
+ 37.785825
+ ],
+ [
+ -122.401705,
+ 37.785993
+ ],
+ [
+ -122.402041,
+ 37.786261
+ ],
+ [
+ -122.402476,
+ 37.786603
+ ],
+ [
+ -122.402573,
+ 37.78668
+ ],
+ [
+ -122.403019,
+ 37.787031
+ ],
+ [
+ -122.403315,
+ 37.78728
+ ],
+ [
+ -122.403358,
+ 37.787324
+ ],
+ [
+ -122.403382,
+ 37.787356
+ ],
+ [
+ -122.403398,
+ 37.787392
+ ],
+ [
+ -122.403405,
+ 37.787425
+ ],
+ [
+ -122.403415,
+ 37.787486
+ ],
+ [
+ -122.403434,
+ 37.787654
+ ],
+ [
+ -122.403436,
+ 37.787676
+ ],
+ [
+ -122.40344,
+ 37.787698
+ ],
+ [
+ -122.403444,
+ 37.787729
+ ],
+ [
+ -122.403464,
+ 37.787825
+ ],
+ [
+ -122.403476,
+ 37.787877
+ ],
+ [
+ -122.403497,
+ 37.787965
+ ],
+ [
+ -122.403591,
+ 37.788436
+ ],
+ [
+ -122.403684,
+ 37.788901
+ ],
+ [
+ -122.403774,
+ 37.789349
+ ],
+ [
+ -122.403798,
+ 37.789469
+ ],
+ [
+ -122.403872,
+ 37.789833
+ ],
+ [
+ -122.404232,
+ 37.789788
+ ],
+ [
+ -122.405435,
+ 37.789635
+ ],
+ [
+ -122.406,
+ 37.789562
+ ],
+ [
+ -122.406982,
+ 37.789436
+ ],
+ [
+ -122.407475,
+ 37.789373
+ ],
+ [
+ -122.408599,
+ 37.789231
+ ],
+ [
+ -122.408616,
+ 37.789229
+ ],
+ [
+ -122.408451,
+ 37.788454
+ ]
+ ]
+} \ No newline at end of file
diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj
index 73c959ab38..2a9c9b5761 100644
--- a/platform/ios/ios.xcodeproj/project.pbxproj
+++ b/platform/ios/ios.xcodeproj/project.pbxproj
@@ -30,6 +30,8 @@
1753ED431E53CE6F00A9FD90 /* MGLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = 1753ED411E53CE6F00A9FD90 /* MGLConversion.h */; };
1F06668A1EC64F8E001C16D7 /* MGLLight.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F0666881EC64F8E001C16D7 /* MGLLight.h */; settings = {ATTRIBUTES = (Public, ); }; };
1F06668D1EC64F8E001C16D7 /* MGLLight.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F0666891EC64F8E001C16D7 /* MGLLight.mm */; };
+ 1F26B6C120E189C9007BCC21 /* MBXCustomLocationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F26B6C020E189C9007BCC21 /* MBXCustomLocationViewController.m */; };
+ 1F26B6C320E1A351007BCC21 /* simple_route.json in Resources */ = {isa = PBXBuildFile; fileRef = 1F26B6C220E1A351007BCC21 /* simple_route.json */; };
1F7454921ECBB42C00021D39 /* MGLLight.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1F0666891EC64F8E001C16D7 /* MGLLight.mm */; };
1F7454931ECBB43F00021D39 /* MGLLight.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F0666881EC64F8E001C16D7 /* MGLLight.h */; settings = {ATTRIBUTES = (Public, ); }; };
1F7454961ECD450D00021D39 /* MGLLight_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F7454941ECD450D00021D39 /* MGLLight_Private.h */; };
@@ -758,6 +760,9 @@
1753ED411E53CE6F00A9FD90 /* MGLConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLConversion.h; sourceTree = "<group>"; };
1F0666881EC64F8E001C16D7 /* MGLLight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLLight.h; sourceTree = "<group>"; };
1F0666891EC64F8E001C16D7 /* MGLLight.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLLight.mm; sourceTree = "<group>"; };
+ 1F26B6BF20E189C9007BCC21 /* MBXCustomLocationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MBXCustomLocationViewController.h; sourceTree = "<group>"; };
+ 1F26B6C020E189C9007BCC21 /* MBXCustomLocationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MBXCustomLocationViewController.m; sourceTree = "<group>"; };
+ 1F26B6C220E1A351007BCC21 /* simple_route.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = simple_route.json; sourceTree = "<group>"; };
1F7454941ECD450D00021D39 /* MGLLight_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLLight_Private.h; sourceTree = "<group>"; };
1F7454A61ED08AB400021D39 /* MGLLightTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLLightTest.mm; path = ../../darwin/test/MGLLightTest.mm; sourceTree = "<group>"; };
1F95931C1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLNSDateAdditionsTests.mm; path = ../../darwin/test/MGLNSDateAdditionsTests.mm; sourceTree = "<group>"; };
@@ -1706,6 +1711,7 @@
353BAEF51D646370009A8DA9 /* amsterdam.geojson */,
DA1DC96C1CB6C6CE006E619F /* points.geojson */,
DA1DC96D1CB6C6CE006E619F /* polyline.geojson */,
+ 1F26B6C220E1A351007BCC21 /* simple_route.json */,
DA1DC96F1CB6C6CE006E619F /* threestates.geojson */,
DD4823721D94AE6C00EB71B7 /* fill_filter_style.json */,
DD4823731D94AE6C00EB71B7 /* line_filter_style.json */,
@@ -1779,6 +1785,8 @@
DA1DC9691CB6C6B7006E619F /* MBXOfflinePacksTableViewController.m */,
927FBCFA1F4DAA8300F8BF1F /* MBXSnapshotsViewController.h */,
927FBCFB1F4DAA8300F8BF1F /* MBXSnapshotsViewController.m */,
+ 1F26B6BF20E189C9007BCC21 /* MBXCustomLocationViewController.h */,
+ 1F26B6C020E189C9007BCC21 /* MBXCustomLocationViewController.m */,
DA1DC9531CB6C1C2006E619F /* MBXViewController.h */,
DA1DC99A1CB6E064006E619F /* MBXViewController.m */,
632281DD1E6F855900D75A5D /* MBXEmbeddedMapViewController.h */,
@@ -2752,6 +2760,7 @@
DA1DC9731CB6C6CE006E619F /* threestates.geojson in Resources */,
DA821D061CCC6D59007508D4 /* LaunchScreen.storyboard in Resources */,
96E027231E57C76E004B8E66 /* Localizable.strings in Resources */,
+ 1F26B6C320E1A351007BCC21 /* simple_route.json in Resources */,
DD4823751D94AE6C00EB71B7 /* fill_filter_style.json in Resources */,
DA1DC99F1CB6E088006E619F /* Assets.xcassets in Resources */,
);
@@ -2852,6 +2861,7 @@
927FBCFC1F4DAA8300F8BF1F /* MBXSnapshotsViewController.m in Sources */,
DA1DC99B1CB6E064006E619F /* MBXViewController.m in Sources */,
40FDA76B1CCAAA6800442548 /* MBXAnnotationView.m in Sources */,
+ 1F26B6C120E189C9007BCC21 /* MBXCustomLocationViewController.m in Sources */,
3E6465D62065767A00685536 /* LimeGreenStyleLayer.m in Sources */,
632281DF1E6F855900D75A5D /* MBXEmbeddedMapViewController.m in Sources */,
);
diff --git a/platform/ios/src/MGLMapView.mm b/platform/ios/src/MGLMapView.mm
index bf6210137a..586e59c9f5 100644
--- a/platform/ios/src/MGLMapView.mm
+++ b/platform/ios/src/MGLMapView.mm
@@ -4691,7 +4691,7 @@ public:
{
_locationManager = locationManager;
_locationManager.delegate = self;
- [self validateLocationServices];
+
}
- (void)validateLocationServices