iOS 16+初始化OpenTelemetry时UserDefault数据丢失求助
解决iOS 16+下OpenTelemetry初始化清除UserDefaults的问题
问题原因
在iOS 16及以上系统中,OpenTelemetry的默认实现会使用默认UserDefaults容器存储追踪上下文等状态数据,初始化时的内部逻辑会意外清空原有数据。
解决方案
通过自定义存储组件,让OpenTelemetry使用独立的存储空间,避免干扰默认UserDefaults:
- 自定义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) } }
- 初始化时配置自定义存储
在注册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())
- 额外检查:URLSession配置
确保传入OtlpHttpTraceExporter的session没有修改默认UserDefaults的逻辑,若无需自定义Session,直接使用URLSession.shared即可。
验证方法
初始化OpenTelemetry前后,分别打印UserDefaults.standard.dictionaryRepresentation(),确认原有键值对未被删除。
内容的提问来源于stack exchange,提问作者Chung
相关产品推荐
相关产品推荐

