Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/api
diff options
context:
space:
mode:
authorAlex Zolotarev <alex@mapswithme.com>2013-07-03 22:58:07 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:57:52 +0300
commit1de9912e0f72cf20aeca315f095ca030637abca6 (patch)
tree8a0a9592f7e7b898a1000373f66a7ac18aa549a2 /api
parentb7be01f495b4f35f4f5190fb7b2a0d8c6cab8e60 (diff)
[ios][api] Restored accidently missed API files
Diffstat (limited to 'api')
-rw-r--r--api/iOS/src/MapsWithMeAPI.h63
-rw-r--r--api/iOS/src/MapsWithMeAPI.m248
2 files changed, 311 insertions, 0 deletions
diff --git a/api/iOS/src/MapsWithMeAPI.h b/api/iOS/src/MapsWithMeAPI.h
new file mode 100644
index 0000000000..0e9c73d495
--- /dev/null
+++ b/api/iOS/src/MapsWithMeAPI.h
@@ -0,0 +1,63 @@
+/*******************************************************************************
+
+ Copyright (c) 2013, MapsWithMe GmbH
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ******************************************************************************/
+
+#import <Foundation/Foundation.h>
+
+#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_4_3
+ #error "MapsWithMe supports iOS >= 4.3 only"
+#endif
+
+// Wrapper for a pin on a map
+@interface MWMPin : NSObject
+
+// [required] pin latitude and longitude
+@property (nonatomic, assign) double lat;
+@property (nonatomic, assign) double lon;
+// [optional] pin title
+@property (nonatomic, retain) NSString * optionalTitle;
+// [optional] passed back to the app when pin is clicked, OR, if it's a valid url,
+// it will be opened from MapsWithMe after selecting "More Details..." for the pin
+@property (nonatomic, retain) NSString * optionalId;
+- (id) initWithLat:(double)lat lon:(double)lon title:(NSString *)title id:(NSString *)pinId;
+@end
+
+
+// MapsWithMe API interface
+@interface MWMApi : NSObject
+
+// returns YES if url is received from MapsWithMe and can be parsed
++ (BOOL) isMapsWithMeUrl:(NSURL *)url;
+// returns nil if received url is invalid or not from MapsWithMe
++ (MWMPin *) pinFromUrl:(NSURL *)url;
+// returns NO if MapsWithMe is not installed or outdated version doesn't support API calls
++ (BOOL) isApiSupported;
++ (BOOL) showLat:(double)lat lon:(double)lon title:(NSString *)optionalTitle id:(NSString *)optionalId;
++ (BOOL) showPin:(MWMPin *)pin;
++ (BOOL) showPins:(NSArray *)pins;
+
+@end
diff --git a/api/iOS/src/MapsWithMeAPI.m b/api/iOS/src/MapsWithMeAPI.m
new file mode 100644
index 0000000000..c5df220f9b
--- /dev/null
+++ b/api/iOS/src/MapsWithMeAPI.m
@@ -0,0 +1,248 @@
+/*******************************************************************************
+
+ Copyright (c) 2013, MapsWithMe GmbH
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ******************************************************************************/
+
+#import "MapsWithMeAPI.h"
+
+#define MAPSWITHME_API_VERSION 1
+
+static NSString * MWMUrlScheme = @"mapswithme://";
+
+@implementation MWMPin
+
+- (id) init
+{
+ if ((self = [super init]))
+ {
+ self.lat = INFINITY;
+ self.lon = INFINITY;
+ }
+ return self;
+}
+
+- (id) initWithLat:(double)lat lon:(double)lon title:(NSString *)title id:(NSString *)pinId
+{
+ if ((self = [super init]))
+ {
+ self.lat = lat;
+ self.lon = lon;
+ self.optionalTitle = title;
+ self.optionalId = pinId;
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ self.optionalTitle = nil;
+ self.optionalId = nil;
+ [super dealloc];
+}
+@end
+
+// Utility class to automatically handle "MapsWithMe is not installed" situations
+@interface MWMNavigationController : UINavigationController
+@end
+@implementation MWMNavigationController
+- (void)onCloseButtonClicked:(id)sender
+{
+ [self dismissModalViewControllerAnimated:YES];
+}
+@end
+
+
+@implementation MWMApi
+
++ (BOOL) isMapsWithMeUrl:(NSURL *)url
+{
+ NSString * appScheme = [MWMApi detectBackUrlScheme];
+ return appScheme && [url.scheme isEqualToString:appScheme];
+}
+
++ (MWMPin *) pinFromUrl:(NSURL *)url
+{
+ if (![MWMApi isMapsWithMeUrl:url])
+ return nil;
+
+ MWMPin * pin = nil;
+ if ([url.host isEqualToString:@"pin"])
+ {
+ pin = [[[MWMPin alloc] init] autorelease];
+ for (NSString * param in [url.query componentsSeparatedByString:@"&"])
+ {
+ NSArray * values = [param componentsSeparatedByString:@"="];
+ if (values.count == 2)
+ {
+ NSString * key = [values objectAtIndex:0];
+ if ([key isEqualToString:@"ll"])
+ {
+ NSArray * coords = [param componentsSeparatedByString:@","];
+ if (coords.count == 2)
+ {
+ pin.lat = [[NSDecimalNumber decimalNumberWithString:[coords objectAtIndex:0]] doubleValue];
+ pin.lon = [[NSDecimalNumber decimalNumberWithString:[coords objectAtIndex:1]] doubleValue];
+ }
+ }
+ else if ([key isEqualToString:@"n"])
+ pin.optionalTitle = [[values objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+ else if ([key isEqualToString:@"id"])
+ pin.optionalId = [[values objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
+ else
+ NSLog(@"Unsupported url parameters: %@", values);
+ }
+ }
+ // do not accept invalid coordinates
+ if (pin.lat > 90. || pin.lat < -90. || pin.lon > 180. || pin.lon < -180.)
+ pin = nil;
+ }
+ return pin;
+}
+
++ (BOOL) isApiSupported
+{
+ return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:MWMUrlScheme]];
+}
+
++ (BOOL) showLat:(double)lat lon:(double)lon title:(NSString *)optionalTitle id:(NSString *)optionalId
+{
+ MWMPin * pin = [[[MWMPin alloc] initWithLat:lat lon:lon title:optionalTitle id:optionalId] autorelease];
+ return [MWMApi showPin:pin];
+}
+
++ (BOOL) showPin:(MWMPin *)pin
+{
+ return [MWMApi showPins:[NSArray arrayWithObject:pin]];
+}
+
++ (BOOL) showPins:(NSArray *)pins
+{
+ // Automatic check that MapsWithMe is installed
+ if (![MWMApi isApiSupported])
+ {
+ // Display dialog with link to the app
+ [MWMApi showMapsWithMeIsNotInstalledDialog];
+ return NO;
+ }
+
+ NSString * appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];
+ NSMutableString * str = [[NSMutableString alloc] initWithFormat:@"%@map?v=%d&appname=%@&", MWMUrlScheme, MAPSWITHME_API_VERSION,
+ [appName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+
+ NSString * backUrlScheme = [MWMApi detectBackUrlScheme];
+ if (backUrlScheme)
+ [str appendFormat:@"backurl=%@&", [backUrlScheme stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+
+ for (MWMPin * point in pins)
+ {
+ [str appendFormat:@"ll=%f,%f&", point.lat, point.lon];
+ @autoreleasepool
+ {
+ if (point.optionalTitle)
+ [str appendFormat:@"n=%@&", [point.optionalTitle stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+ if (point.optionalId)
+ [str appendFormat:@"id=%@&", [point.optionalId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
+ }
+ }
+
+ NSURL * url = [[NSURL alloc] initWithString:str];
+ [str release];
+ if (url)
+ {
+ [[UIApplication sharedApplication] openURL:url];
+ [url release];
+ return YES;
+ }
+ else
+ {
+ NSLog(@"Can't generate correct url");
+ return NO;
+ }
+}
+
++ (NSString *) detectBackUrlScheme
+{
+ for (NSDictionary * dict in [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleURLTypes"])
+ {
+ if ([[dict objectForKey:@"CFBundleURLName"] rangeOfString:@"mapswithme" options:NSCaseInsensitiveSearch].location != NSNotFound)
+ {
+ for (NSString * scheme in [dict objectForKey:@"CFBundleURLSchemes"])
+ {
+ if ([scheme rangeOfString:@"mapswithme" options:NSCaseInsensitiveSearch].location != NSNotFound)
+ return scheme;
+ }
+ }
+ }
+ NSLog(@"WARNING: No com.mapswithme.maps url schemes are added in the Info.plist file. Please add them if you want API users to come back to your app.");
+ return nil;
+}
+
+// HTML page for users who didn't install MapsWithMe
+static NSString * mapsWithMeIsNotInstalledPage =
+@"<html>" \
+"<head>" \
+"<title>Please install MapsWithMe - offline maps of the World</title>" \
+"<meta name='viewport' content='width=device-width, initial-scale=1.0'/>" \
+"<meta charset='UTF-8'/>" \
+"<style type='text/css'>" \
+"body { font-family: Roboto,Helvetica; background-color:#fafafa; text-align: center;}" \
+".description { text-align: center; font-size: 0.85em; margin-bottom: 1em; }" \
+".button { -moz-border-radius: 20px; -webkit-border-radius: 20px; -khtml-border-radius: 20px; border-radius: 20px; padding: 10px; text-decoration: none; display:inline-block; margin: 0.5em; }" \
+".shadow { -moz-box-shadow: 3px 3px 5px 0 #444; -webkit-box-shadow: 3px 3px 5px 0 #444; box-shadow: 3px 3px 5px 0 #444; }" \
+".lite { color: white; background-color: #333; }" \
+".pro { color: white; background-color: green; }" \
+".mwm { color: green; text-decoration: none; }" \
+"</style>" \
+"</head>" \
+"<body>" \
+"<div class='description'><a href='http://mapswith.me' target='_blank' class='mwm'>MapsWithMe</a> app should be installed to view the map.</div>" \
+"<a href='http://mapswith.me/app?api' class='lite button shadow'>Download&nbsp;MapsWithMe&nbsp;Lite&nbsp;(free)</a>" \
+"<a href='http://mapswith.me/get?api' class='pro button shadow'>Download&nbsp;MapsWithMe&nbsp;Pro</a>" \
+"</body>" \
+"</html>";
+
+
+// For gethostbyname below
+#include <netdb.h>
+
++ (void) showMapsWithMeIsNotInstalledDialog
+{
+ UIWebView * webView = [[[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
+ // check that we have Internet connection and display fresh online page if possible
+ if (gethostbyname("google.com"))
+ [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://mapswith.me/api_mwm_not_installed"]]];
+ else
+ [webView loadHTMLString:mapsWithMeIsNotInstalledPage baseURL:[NSURL URLWithString:@"http://mapswith.me/"]];
+ UIViewController * webController = [[[UIViewController alloc] init] autorelease];
+ webController.view = webView;
+ webController.title = @"Install MapsWithMe";
+ MWMNavigationController * navController = [[[MWMNavigationController alloc] initWithRootViewController:webController] autorelease];
+ navController.navigationBar.topItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStyleDone target:navController action:@selector(onCloseButtonClicked:)];
+
+ [[[UIApplication sharedApplication] delegate].window.rootViewController presentModalViewController:navController animated:YES];
+}
+
+@end