有没有办法将地图数据绑定到iOS应用程序?

有没有办法将地图数据绑定到iOS应用程序?,ios,caching,Ios,Caching,我有一个客户对iOS应用程序感兴趣,但其中一个要求是离线地图。不幸的是,谷歌地图和iOS地图都需要活动的互联网连接才能下载数据。一旦你打开应用程序一次,我想你可以触发一个区域的缓存,但你仍然需要这个连接 有没有办法将实际的地图数据绑定到应用程序中,或者我需要通过编写自己的地图代码来重新发明轮子?我以前遇到过这个问题,我找到的唯一方法是使用名为的第三方地图分幅提供商。它们还为iOS和其他平台提供了API。您甚至可以通过使用自定义自己的地图。前者甚至允许您将地图分幅导出为MBTiles文件,这提供了

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


有没有办法将实际的地图数据绑定到应用程序中,或者我需要通过编写自己的地图代码来重新发明轮子?

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

如果你的应用程序是iOS 7+,那么使用MKTileOverlay就有一定的灵活性。它允许你在普通的苹果地图上放置你自己的瓷砖

通过创建MKTileOverlay子类并重载
loadTileAtPath:
,您可以检查捆绑包的初始状态,然后可能为internet连接时加载的磁贴创建单独的缓存,最后在所有其他操作失败时使用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);
        }];
    }
} 

更多信息和一些示例

此外,MapKit和GoogleMaps iOS SDK也会自动缓存,但有时这还不足以满足应用程序的要求。