Skip to content

Commit

Permalink
Merge pull request #15 from maptiler/open-geo-uris
Browse files Browse the repository at this point in the history
[macos] Added open geo url support to the macos app.
  • Loading branch information
petr-pokorny-1 authored Feb 3, 2021
2 parents 2f480bf + 276bae5 commit cd8d564
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 10 deletions.
2 changes: 1 addition & 1 deletion platform/ios/platform/darwin/test/MGLMapSnapshotterTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ - (void)testDelegate {
}
[completionExpectation fulfill];
}];
[self waitForExpectations:@[self.styleLoadingExpectation, completionExpectation] timeout:5 enforceOrder:YES];
[self waitForExpectations:@[self.styleLoadingExpectation, completionExpectation] timeout:10 enforceOrder:YES];
}

- (void)testRuntimeStyling {
Expand Down
38 changes: 29 additions & 9 deletions platform/ios/platform/macos/app/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -157,32 +157,52 @@ - (void)applicationWillTerminate:(NSNotification *)notification {
#pragma mark Services

- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent {
// geo:29.95,-90.066667,3000
// geo:29.95,-90.066667?z=14
// mapboxgl://?center=29.95,-90.066667&zoom=14&bearing=45&pitch=30
NSURL *url = [NSURL URLWithString:[event paramDescriptorForKeyword:keyDirectObject].stringValue];

NSURLComponents *components = [NSURLComponents componentsWithString:[event paramDescriptorForKeyword:keyDirectObject].stringValue];
BOOL isGLURL = [components.scheme isEqualToString:@"mapboxgl"];
BOOL isGeoURL = [components.scheme isEqualToString:@"geo"];

NSString *centerString;

NSMutableDictionary<NSString *, NSString *> *params = [[NSMutableDictionary alloc] init];
for (NSString *param in [url.query componentsSeparatedByString:@"&"]) {
NSArray *parts = [param componentsSeparatedByString:@"="];
if (parts.count >= 2) {
params[parts[0]] = [parts[1] stringByRemovingPercentEncoding];
}
for (NSURLQueryItem *queryItem in components.queryItems) {
params[queryItem.name] = queryItem.value;
}

if (isGLURL) {
centerString = params[@"center"];
} else if (isGeoURL) {
NSArray<NSString *> *parsedPath = [components.path componentsSeparatedByString:@";"];
centerString = parsedPath.firstObject;
for (NSString *param in [parsedPath subarrayWithRange:NSMakeRange(1, parsedPath.count - 1)]) {
NSArray *parts = [param componentsSeparatedByString:@"="];
if (parts.count >= 2) {
params[parts[0]] = parts[1];
}
}
}

MGLMapCamera *camera = [MGLMapCamera camera];
NSString *zoomLevelString = params[@"zoom"];
NSString *zoomLevelString = params[@"zoom"] ?: params[@"z"];
self.pendingZoomLevel = zoomLevelString.length ? zoomLevelString.doubleValue : -1;

NSString *directionString = params[@"bearing"];
if (directionString.length) {
camera.heading = directionString.doubleValue;
}

NSString *centerString = params[@"center"];
if (centerString) {
NSArray *coordinateValues = [centerString componentsSeparatedByString:@","];
if (coordinateValues.count == 2) {
if (coordinateValues.count >= 2) {
camera.centerCoordinate = CLLocationCoordinate2DMake([coordinateValues[0] doubleValue],
[coordinateValues[1] doubleValue]);
}
if (coordinateValues.count == 3) {
camera.altitude = [coordinateValues[2] doubleValue];
}
}

NSString *pitchString = params[@"pitch"];
Expand Down
10 changes: 10 additions & 0 deletions platform/ios/platform/macos/app/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,16 @@
<string>mapboxgl</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleURLSchemes</key>
<array>
<string>geo</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>15256</string>
Expand Down

0 comments on commit cd8d564

Please sign in to comment.