13 changed files with 347 additions and 95 deletions
@ -0,0 +1,156 @@ |
|||||
|
import Foundation |
||||
|
import UIKit |
||||
|
|
||||
|
public class UserPortrait: NSObject { |
||||
|
private static let TAG = "UserPortrait" |
||||
|
private static let PREF_NAME = "deep_voice_user" |
||||
|
|
||||
|
// 单例实例 |
||||
|
public static let shared = UserPortrait() |
||||
|
|
||||
|
private var appContext: UIApplication? |
||||
|
private var userDefaults: UserDefaults? |
||||
|
private var portrait: [String: Any] = [:] |
||||
|
|
||||
|
// 私有初始化方法,防止外部创建实例 |
||||
|
private override init() { |
||||
|
super.init() |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 初始化用户画像 |
||||
|
*/ |
||||
|
public func initialize() { |
||||
|
do { |
||||
|
// 注册通知监听器 |
||||
|
NotificationCenter.default.addObserver( |
||||
|
self, |
||||
|
selector: #selector(handleUpdatePortrait(_:)), |
||||
|
name: NSNotification.Name("com.yunqiinnovation.user_portrait.UPDATE_PORTRAIT"), |
||||
|
object: nil |
||||
|
) |
||||
|
|
||||
|
// 获取 UserDefaults |
||||
|
appContext = UIApplication.shared |
||||
|
userDefaults = UserDefaults(suiteName: UserPortrait.PREF_NAME) ?? UserDefaults.standard |
||||
|
|
||||
|
// 加载已保存的画像数据 |
||||
|
loadPortraitFromDefaults() |
||||
|
|
||||
|
print("\(UserPortrait.TAG): 用户画像初始化成功") |
||||
|
} catch { |
||||
|
print("\(UserPortrait.TAG): 初始化用户画像时发生异常: \(error.localizedDescription)") |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 处理更新画像通知 |
||||
|
*/ |
||||
|
@objc private func handleUpdatePortrait(_ notification: Notification) { |
||||
|
print("\(UserPortrait.TAG): 接收到通知事件 \(notification.name.rawValue)") |
||||
|
|
||||
|
guard let userInfo = notification.userInfo, |
||||
|
let key = userInfo["key"] as? String, |
||||
|
let value = userInfo["value"] as? String else { |
||||
|
print("\(UserPortrait.TAG): 通知数据格式错误") |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
print("\(UserPortrait.TAG): 收到 UPDATE_PORTRAIT 通知 \(key):\(value)") |
||||
|
|
||||
|
if !key.isEmpty { |
||||
|
print("\(UserPortrait.TAG): 接收到画像更新:\(key) = \(value)") |
||||
|
set(key: key, value: value) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 从 UserDefaults 加载画像数据 |
||||
|
*/ |
||||
|
private func loadPortraitFromDefaults() { |
||||
|
guard let defaults = userDefaults else { return } |
||||
|
|
||||
|
// 获取所有保存的键值对 |
||||
|
let allKeys = defaults.dictionaryRepresentation().keys |
||||
|
for key in allKeys { |
||||
|
if let value = defaults.object(forKey: key) { |
||||
|
portrait[key] = value |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取所有画像数据 |
||||
|
*/ |
||||
|
public func getAll() -> [String: String] { |
||||
|
return portrait.compactMapValues { value in |
||||
|
return String(describing: value) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 设置画像字段 |
||||
|
*/ |
||||
|
public func set(key: String, value: String) { |
||||
|
userDefaults?.set(value, forKey: key) |
||||
|
userDefaults?.synchronize() // 立即同步到磁盘 |
||||
|
|
||||
|
// 更新内存中的画像数据 |
||||
|
portrait[key] = value |
||||
|
|
||||
|
print("\(UserPortrait.TAG): 设置画像字段 \(key) = \(value)") |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 获取指定键的画像值 |
||||
|
*/ |
||||
|
public func get(key: String) -> String? { |
||||
|
return portrait[key] as? String |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 清空所有画像数据 |
||||
|
*/ |
||||
|
public func clean() { |
||||
|
portrait.removeAll() |
||||
|
|
||||
|
// 清空 UserDefaults 中的数据 |
||||
|
if let defaults = userDefaults { |
||||
|
let allKeys = defaults.dictionaryRepresentation().keys |
||||
|
for key in allKeys { |
||||
|
defaults.removeObject(forKey: key) |
||||
|
} |
||||
|
defaults.synchronize() |
||||
|
} |
||||
|
|
||||
|
print("\(UserPortrait.TAG): 已清空所有画像数据") |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 发送更新画像通知(用于其他模块触发更新) |
||||
|
*/ |
||||
|
public func sendUpdateNotification(key: String, value: String) { |
||||
|
let userInfo: [String: Any] = [ |
||||
|
"key": key, |
||||
|
"value": value |
||||
|
] |
||||
|
|
||||
|
NotificationCenter.default.post( |
||||
|
name: NSNotification.Name("com.yunqiinnovation.user_portrait.UPDATE_PORTRAIT"), |
||||
|
object: nil, |
||||
|
userInfo: userInfo |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 移除通知监听器(在应用退出时调用) |
||||
|
*/ |
||||
|
public func deinitialize() { |
||||
|
NotificationCenter.default.removeObserver( |
||||
|
self, |
||||
|
name: NSNotification.Name("com.yunqiinnovation.user_portrait.UPDATE_PORTRAIT"), |
||||
|
object: nil |
||||
|
) |
||||
|
print("\(UserPortrait.TAG): 用户画像已清理") |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue