强制MapKit仅使用已缓存的地图瓦片/以编程方式禁用网络

11

我们遇到了这样的问题。

我们正在开发一款旅游应用程序。为了确保用户在我们的应用程序中不花费太多的漫游费,我们决定实现一个设置选项,让用户仅查看缓存地图。因此,我们让用户决定是否从互联网加载地图,还是节省钱并查看缓存地图(存储在Library/Caches/MapTiles/MapTiles.sqlitedb中)。

我们无法找到一种实现方法。在这种情况下,有没有办法通过编程方式禁用网络?或者强制MapKit只使用缓存的瓷砖?我们考虑通过编程方式更改APN选项来强制MapKit脱机。有可能通过编程方式更改APN吗?

谢谢!

4个回答

4

iPhone SDK应用程序无法访问网络适配器设置,而且我不知道MapKit API中是否有任何东西可以控制其互联网使用。在这种情况下,您最好的选择可能是提供一个警报建议用户启用飞行模式或关闭数据漫游。


实际上,iPhone SDK具有可达性API,当您需要知道网络是否可访问时非常有用。 - Nik

2

使用OpenStreetMap Cloud-made允许离线地图

http://developers.cloudmade.com/projects/show/iphone-sdk

以下是帮助iPhone开发人员使用OSM地图的库: route-me是一个开源库,在许多iPhone应用程序中用于显示OSM地图。 CloudMade iPhone Maps Library是一个开源库,提供对CloudMade基于OSM的地图瓦片的高级访问,具有不同大小和不同样式。 John McKerrell已经将路由算法从gosmore移植到iPhone上,并成功生成了基本路线。目前,更复杂的路线会导致iPhone崩溃。


Cloudmade将允许您在应用程序中缓存他们的瓦片(使用Mercator瓦片系统),但是API尚不支持此功能,您必须自己编写功能来实现此操作(目前如此)。 - Willster
不确定是否选择Cloud-made..看看为什么http://stackoverflow.com/questions/7928199/cloudmade-status#comment11002846_7928199 - HurkNburkS

1

有几种方法。其中一种是使用自己的瓦片覆盖层,并在URLForTilePath:或loadTileAtPath:result:中实现缓存算法。

它在开放域和一些私有域中运行得非常好。不会缓存标准的Apple地图。

另一种能够缓存所有内容的方法是子类化NSURLProtocol。有一些教程,可能您可以检测何时是地图图像并相应地采取行动。


-1

谷歌地图应用程序具有缓存功能... MapKit似乎没有,我认为苹果将在下一个版本的SDK中添加此功能...


实际上,我们能够在没有网络连接的情况下查看应用程序中的缓存地图瓦片。问题是我们无法实现用户设置“离线模式”的情况。当选择此选项时,即使有网络连接,我们也需要显示缓存的地图瓦片。因此,我们需要强制MapKit使用缓存瓦片而不是联机。谢谢。 - Slava TLM
也许在我们尝试加载地图时,即使不被允许,也可以以某种方式更改APN设置。这样,应用程序将无法联网,并被迫使用本地数据库。 - Slava TLM
当应用没有网络连接时,它将从本地文件夹中提取缓存的地图瓦片。因此,无需对代码进行任何更改-只需遵循苹果的文档 :) - Slava TLM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接