5 changed files with 189 additions and 7 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