You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Mapbox 6迁移至Mapbox 10:如何为矢量源设置授权头?

Mapbox 10 为矢量源设置授权头的解决方案

Mapbox 10 中依然可以通过自定义URLProtocol拦截请求并添加授权头,但配置方式和 Mapbox 6 有所不同,以下是具体实现步骤:

1. 复用原自定义URLProtocol逻辑

你之前在 Mapbox 6 中实现的URLProtocol子类可以直接复用,核心拦截、添加授权头的逻辑无需修改,示例如下:

class CustomAuthURLProtocol: URLProtocol {
    override class func canInit(with request: URLRequest) -> Bool {
        // 可限定仅拦截目标瓦片域名的请求,避免全局拦截
        return request.url?.host == "www.demo-endpoint.com"
    }

    override class func canonicalRequest(for request: URLRequest) -> URLRequest {
        return request
    }

    override func startLoading() {
        var mutableRequest = request
        // 添加授权头,替换为你的实际授权凭证
        mutableRequest.setValue("Bearer YOUR_AUTH_TOKEN", forHTTPHeaderField: "Authorization")
        
        let task = URLSession.shared.dataTask(with: mutableRequest) { [weak self] data, response, error in
            guard let self = self else { return }
            if let data = data {
                self.client?.urlProtocol(self, didLoad: data)
            }
            if let response = response {
                self.client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed)
            }
            if let error = error {
                self.client?.urlProtocol(self, didFailWithError: error)
            }
            self.client?.urlProtocolDidFinishLoading(self)
        }
        task.resume()
    }

    override func stopLoading() {}
}

2. 在 Mapbox 10 中注册自定义URLProtocol

Mapbox 10 弃用了MGLNetworkConfiguration,改为通过ResourceOptions或NetworkConfiguration配置网络会话,两种方式任选其一:

方式一:初始化 MapView 时绑定配置

// 初始化资源配置,传入你的 Mapbox Access Token
let resourceOptions = ResourceOptions(accessToken: "YOUR_MAPBOX_ACCESS_TOKEN")
// 创建自定义会话配置
let sessionConfig = URLSessionConfiguration.default
// 将自定义协议加入列表,保留原有协议避免影响其他请求
sessionConfig.protocolClasses = [CustomAuthURLProtocol.self] + (sessionConfig.protocolClasses ?? [])
// 绑定会话配置到资源选项
resourceOptions.urlSessionConfiguration = sessionConfig

// 使用配置好的资源选项创建 MapView
let mapView = MapView(frame: view.bounds, resourceOptions: resourceOptions)

方式二:全局修改网络配置

若无需针对单个 MapView 做差异化配置,可直接全局修改:

let sessionConfig = NetworkConfiguration.shared.urlSessionConfiguration
sessionConfig.protocolClasses = [CustomAuthURLProtocol.self] + (sessionConfig.protocolClasses ?? [])
NetworkConfiguration.shared.urlSessionConfiguration = sessionConfig

3. 验证效果

配置完成后,你的矢量源请求会被自定义URLProtocol拦截并自动添加授权头,即可正常访问需要权限的瓦片端点。

内容的提问来源于stack exchange,提问作者πter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:30:38