Integrate Umeng analytics and APM

This commit is contained in:
2026-07-07 14:20:04 +08:00
parent 9899a2ccb3
commit 6bdabadc3b
9 changed files with 155 additions and 2 deletions
+51
View File
@@ -0,0 +1,51 @@
//
// UmengBootstrap.swift
// suixinkan
//
import Foundation
/// 友盟 SDK 隐私合规初始化入口,必须在用户同意隐私政策后调用。
enum UmengBootstrap {
/// 当前进程内是否已经完成友盟 SDK 初始化。
private(set) static var isConfigured = false
private static let lock = NSLock()
private static var configureHandler: (_ appKey: String, _ channel: String) -> Void = { appKey, channel in
UMConfigure.setLogEnabled(false)
UMConfigure.initWithAppkey(appKey, channel: channel)
}
/// 在用户已同意 App 隐私政策后配置友盟 SDK,幂等。
@discardableResult
static func configureIfNeeded(appStore: AppStore = .shared) -> Bool {
guard appStore.privacyAgreementAccepted else { return false }
lock.lock()
defer { lock.unlock() }
guard !isConfigured else { return true }
configureHandler(UmengConfig.appKey, UmengConfig.channel)
isConfigured = true
return true
}
/// 测试专用:替换真实 SDK 初始化实现。
static func setConfigureHandlerForTesting(_ handler: @escaping (_ appKey: String, _ channel: String) -> Void) {
lock.lock()
defer { lock.unlock() }
configureHandler = handler
}
/// 测试专用:重置初始化状态与默认初始化实现。
static func resetForTesting() {
lock.lock()
defer { lock.unlock() }
isConfigured = false
configureHandler = { appKey, channel in
UMConfigure.setLogEnabled(false)
UMConfigure.initWithAppkey(appKey, channel: channel)
}
}
}
+15
View File
@@ -0,0 +1,15 @@
//
// UmengConfig.swift
// suixinkan
//
import Foundation
/// 友盟统计与性能监控 SDK 配置。
enum UmengConfig {
/// 友盟后台申请的 iOS AppKey。
nonisolated static let appKey = "6a470b81cbfa6959516c34d0"
/// 友盟渠道标识,默认使用官方 App Store 渠道。
nonisolated static let channel = "App Store"
}