【发布时间】:2009-06-02 10:44:53
【问题描述】:
编写一个 iPhone 应用程序,我需要使用 Google Maps api 来获取方向和路线。不幸的是,Google Maps 使用 javascript。
知道怎么做吗?
【问题讨论】:
标签: javascript iphone google-maps maps
编写一个 iPhone 应用程序,我需要使用 Google Maps api 来获取方向和路线。不幸的是,Google Maps 使用 javascript。
知道怎么做吗?
【问题讨论】:
标签: javascript iphone google-maps maps
在执行此操作之前,您应该知道在付费应用程序中使用地图数据是违反 Google 的条款和条件的。
来自http://code.google.com/apis/maps/terms.html
9.1 对您的 Maps API 实施的免费、公开可访问性。您的地图 API 实施必须普遍 用户可以免费访问。 您可能要求用户登录 如果您这样做,您的 Maps API 实现 不需要用户付费。除非 你已经进入了一个单独的 与谷歌的书面协议或 获得谷歌的书面许可, 您的 Maps API 实施不得:
(a) 需要付费订阅 或其他收费的受限访问; 或 (b) 仅在防火墙后运行 或仅在内部网络上(除了 在开发和测试期间 阶段)。
10.8 使用静态地图 API,而不是在网络中的实现中 浏览器;
我也包含了第 10.8 节。这是一个值得商榷的问题,因为您可能会争辩说 UIWebView 是一个浏览器,但仍然要意识到这一点。
如果您决定继续使用它,以下是一个非常好的实现,它可以连接您需要的大部分代码,http://code.google.com/p/iphone-google-maps-component/
【讨论】:
您可以使用 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 会引发异常。
【讨论】:
由于您需要遵守 OS 3.0 API 才能在应用商店中启动您的应用,因此您不妨开始使用 MapKit API 方法在您的应用中嵌入 Google 地图,而无需使用 WebView。上述解决方案是 Google 地图过去“嵌入”到您的应用程序中的方式,但现在您可以在 OS 3.0 中使用 MapKit。
【讨论】: