有没有办法将地图数据与iOS应用程序捆绑在一起?

时间:2014-03-03 20:47:44

标签: ios caching

我的客户对iOS应用感兴趣,但其中一个要求是离线地图。不幸的是,Google和iOS地图都需要有效的互联网连接来下载数据。一旦你打开应用程序一次,我认为你可以触发一个区域的缓存,但你仍然需要这个连接。

有没有办法将实际的地图数据与应用程序捆绑在一起,还是我需要通过编写自己的地图代码来重新发明轮子?

2 个答案:

答案 0 :(得分:2)

如果您的应用是iOS 7+,那么使用MKTileOverlay可以获得一些灵活性。它允许您将自己的图块集放在普通的Apple地图上。

通过创建MKTileOverlay子类并重载loadTileAtPath:,你可以检查你的包的初始状态,然后可能是一个单独的缓存,用于在有互联网连接时加载的磁贴,最后使用URL加载磁贴一切都失败了。

- (void)loadTileAtPath:(MKTileOverlayPath)path
                result:(void (^)(NSData *data, NSError *error))result
{
    if (!result) {
        return;
    }

    NSString *filePath = ...; // Predetermined filename based off of MKTileOverlayPath
    NSData *initialData = [NSData dataWithContentsOfFile:filePath];  
    NSData *cachedData = [self.cache objectForKey:[self URLForTilePath:path]];
    if (initialData) {
        result(initialData, nil);
    } else if (cachedData) {
        result(cachedData, nil);
    } else {
        NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]];
        [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            result(data, connectionError);
        }];
    }
} 

更多信息和一些示例here

答案 1 :(得分:1)

之前我遇到过这个问题,我发现的唯一方法是使用名为MapBox的第三方地图图块提供程序。它们还为iOS和其他平台提供API。您甚至可以使用TileMill自定义自己的地图。前者甚至允许您将地图图块导出为MBTiles文件,该文件提供了在单个SQLite数据库中存储数百万个图块的方法,从而可以在单个文件中存储和传输Web地图。