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