You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MapBox离线地图避免重复下载:新版本本地检查方案求助

解决MapBox新版本离线包重复下载的检查问题

我明白你的困扰——MapBox更新后旧的离线包检查API不能用了,导致没法判断是否已经下载过目标区域,容易触发重复下载。下面是适配新版本API的完整解决方案,直接替换你的原有代码即可:

适配后的完整代码

func startOfflinePackDownload() {
    // 先检查是否已经存在同名离线包
    let targetPackName = "My Offline Pack"
    let existingPacks = MGLOfflineStorage.shared().packs
    
    for pack in existingPacks {
        // 用新版本的安全解归档方式解析用户信息
        guard let userInfo = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(pack.context) as? [String: String] else {
            continue
        }
        if userInfo["name"] == targetPackName {
            print("⚠️ 该离线包已存在,无需重复下载")
            return
        }
    }
    
    // 若没有已存在的包,创建并启动下载
    let region = MGLTilePyramidOfflineRegion(styleURL: mapView.styleURL,
                                             bounds: mapView.visibleCoordinateBounds,
                                             fromZoomLevel: mapView.zoomLevel,
                                             toZoomLevel: 13)
    
    // 用新版本的安全归档方式打包用户信息
    guard let context = try? NSKeyedArchiver.archivedData(
        withRootObject: ["name": targetPackName],
        requiringSecureCoding: false
    ) else {
        print("❌ 归档离线包信息失败")
        return
    }
    
    MGLOfflineStorage.shared().addPack(for: region, withContext: context) { pack, error in
        guard let validPack = pack, error == nil else {
            print("❌ 创建离线包失败: \(error?.localizedDescription ?? "未知错误")")
            return
        }
        validPack.resume()
        print("✅ 开始下载离线包")
    }
}

关键的API变更说明

  • 离线包列表获取:旧版的sharedOfflineStorage().getPacksWithCompletionHandler被移除,现在直接通过MGLOfflineStorage.shared().packs同步获取所有已下载的离线包,无需异步回调,代码更简洁。
  • 归档/解归档:苹果废弃了旧的NSKeyedArchiver方法,改用带安全编码检查的新方法,避免运行时警告和潜在的兼容性问题。
  • 错误处理强化:增加了解归档失败的容错逻辑,避免单个损坏的离线包影响整个检查流程。

额外小提示

  • 如果需要区分不同区域的离线包(比如同名但不同 bounds 的情况),建议在userInfo里增加唯一标识(比如区域ID或者经纬度哈希值),检查时同时验证名称和区域信息,避免误判。
  • 可以给离线包设置MGLOfflinePackDelegate,监听下载进度和完成状态,给用户更直观的反馈。

内容的提问来源于stack exchange,提问作者M.Strachan

火山引擎 最新活动