编写一个 iPhone 应用程序,我需要使用 Google Maps api 来获取方向和路线。不幸的是,谷歌地图是围绕 javascript 工作的。
知道怎么做吗?
编写一个 iPhone 应用程序,我需要使用 Google Maps api 来获取方向和路线。不幸的是,谷歌地图是围绕 javascript 工作的。
知道怎么做吗?
在执行此操作之前,您应该知道在付费应用程序中使用地图数据是违反 Google 的条款和条件的。
来自http://code.google.com/apis/maps/terms.html
9.1 对您的 Maps API 实施的免费、公开可访问性。您的 Maps API 实施必须通常可供用户免费访问。如果您不要求用户付费,您可能会要求用户登录您的 Maps API 实施。除非您已与 Google 签订单独的书面协议或获得 Google 的书面许可,否则您的 Maps API 实施不得:
(a) 需要收费订阅或其他收费的受限访问;(b) 仅在防火墙后或仅在内部网络上运行(开发和测试阶段除外)。
10.8 使用静态地图 API,而不是在网络浏览器中的实现;
我也包括了第 10.8 节。这是一个有争议的问题,因为您可能会争辩说 UIWebView 是一个浏览器,但仍然要注意它。
如果您决定继续使用它,那么以下是一个非常好的实现,可以连接您需要的大部分代码,http://code.google.com/p/iphone-google-maps-component/
由于您需要遵守 OS 3.0 API 才能在应用商店中启动您的应用,您不妨开始使用 MapKit API 方法在您的应用中嵌入 Google 地图,而无需使用 WebView。上面的解决方案是 Google 地图过去是如何“嵌入”到您的应用程序中的,但现在您可以在 OS 3.0 中使用 MapKit。
您可以使用 UIWebView 来实现这一点。在使用 JavaScript 通过其 Google Maps API 访问 Google Maps 服务时,您只需利用 UIWebView 方法:
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
请注意,您需要在代表脚本的字符串中转义,所有出现的双引号都需要根据需要进行转义。
例如,以下将地图居中所需的方法取自 Maher Ali 的 iPhone SDK 编程第 12 章:
-(void) centerMap:(NSUInteger) index{
CLLocation *loc = [locations objectAtIndex:index];
NSString *js =
[NSString stringWithFormat:
@"var map = new GMap2(document.getElementById(\"map_canvas\"));"
"map.setMapType(G_HYBRID_MAP);"
"map.setCenter(new GLatLng(%lf, %lf), 18);"
"map.panTo(map.getCenter());"
"map.openInfoWindow(map.getCenter(),"
"document.createTextNode(\"Loc: (%i/%i), Time: %@\"));",
[loc coordinate].latitude, [loc coordinate].longitude,
index+1, [locations count],
[loc timestamp]];
[webView stringByEvaluatingJavaScriptFromString:js];
}
另外,请记住 Apple 文档中的以下内容:
每个顶级入口点的 JavaScript 执行时间限制为 10 秒。如果您的脚本执行超过 10 秒,Safari 将停止执行该脚本。这很可能发生在代码中的随机位置,因此可能会导致意想不到的后果。施加此限制是因为 JavaScript 执行可能会导致主线程阻塞,因此当脚本运行时,用户无法与网页交互。
JavaScript 分配也限制为 10 MB。如果超过 JavaScript 的总内存分配限制,Safari 会引发异常。