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

iOS 16+初始化OpenTelemetry时UserDefault数据丢失求助

解决iOS 16+下OpenTelemetry初始化清除UserDefaults的问题

问题原因

在iOS 16及以上系统中,OpenTelemetry的默认实现会使用默认UserDefaults容器存储追踪上下文等状态数据,初始化时的内部逻辑会意外清空原有数据。

解决方案

通过自定义存储组件,让OpenTelemetry使用独立的存储空间,避免干扰默认UserDefaults:

  1. 自定义ContextStorage
    实现ContextStorage协议,使用单独的UserDefaults分组(而非默认的standard)来存储OpenTelemetry的上下文数据:
import OpenTelemetryApi

class CustomContextStorage: ContextStorage {
    private let userDefaults: UserDefaults
    
    init(suiteName: String = "com.your.app.opentelemetry") {
        self.userDefaults = UserDefaults(suiteName: suiteName)!
    }
    
    func setContext(_ context: Context, forKey key: String) {
        let data = try? NSKeyedArchiver.archivedData(withRootObject: context, requiringSecureCoding: true)
        userDefaults.set(data, forKey: key)
    }
    
    func getContext(forKey key: String) -> Context? {
        guard let data = userDefaults.data(forKey: key) else { return nil }
        return try? NSKeyedUnarchiver.unarchivedObject(ofClass: Context.self, from: data)
    }
    
    func removeContext(forKey key: String) {
        userDefaults.removeObject(forKey: key)
    }
}
  1. 初始化时配置自定义存储
    在注册TracerProvider前,先设置OpenTelemetry使用自定义的ContextStorage:
// 优先配置自定义存储
OpenTelemetry.contextProvider = DefaultContextProvider(storage: CustomContextStorage())

// 再执行原有的TracerProvider初始化逻辑
OpenTelemetry.registerTracerProvider(tracerProvider: TracerProviderBuilder()
         .add(spanProcessor: SimpleSpanProcessor(spanExporter: OtlpHttpTraceExporter(endpoint: endpoint, useSession: session)))
         .with(resource: resource)
         .build())
  1. 额外检查:URLSession配置
    确保传入OtlpHttpTraceExporter的session没有修改默认UserDefaults的逻辑,若无需自定义Session,直接使用URLSession.shared即可。

验证方法

初始化OpenTelemetry前后,分别打印UserDefaults.standard.dictionaryRepresentation(),确认原有键值对未被删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:52:09