升级 AppStore 缓存 Key 并在覆盖安装时强制重新登录。

统一账号作用域 Key 对齐 Android,新增缓存 schema 迁移清理旧数据,并同步更新相关模块与单元测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-14 09:35:55 +08:00
parent 05804ba7d6
commit c083f1d4b3
31 changed files with 852 additions and 123 deletions

View File

@ -25,33 +25,53 @@ final class AppLocationStore {
/// 线
var onlineStatus: Bool {
get { defaults.bool(forKey: scopedKey(.onlineStatus)) }
set { defaults.set(newValue, forKey: scopedKey(.onlineStatus)) }
get {
guard let key = scopedKey(.onlineStatus) else { return false }
return defaults.bool(forKey: key)
}
set {
guard let key = scopedKey(.onlineStatus) else { return }
defaults.set(newValue, forKey: key)
}
}
///
var lastReportTime: Int64 {
get { Int64(defaults.integer(forKey: scopedKey(.lastReportTime))) }
set { defaults.set(Int(newValue), forKey: scopedKey(.lastReportTime)) }
get {
guard let key = scopedKey(.lastReportTime) else { return 0 }
return Int64(defaults.integer(forKey: key))
}
set {
guard let key = scopedKey(.lastReportTime) else { return }
defaults.set(Int(newValue), forKey: key)
}
}
/// 0
var reminderMinutes: Int {
get { defaults.integer(forKey: scopedKey(.reminderMinutes)) }
set { defaults.set(newValue, forKey: scopedKey(.reminderMinutes)) }
get {
guard let key = scopedKey(.reminderMinutes) else { return 0 }
return defaults.integer(forKey: key)
}
set {
guard let key = scopedKey(.reminderMinutes) else { return }
defaults.set(newValue, forKey: key)
}
}
///
func clearLastReportTime() {
defaults.removeObject(forKey: scopedKey(.lastReportTime))
guard let key = scopedKey(.lastReportTime) else { return }
defaults.removeObject(forKey: key)
}
///
func clear() {
Key.allCases.forEach { defaults.removeObject(forKey: scopedKey($0)) }
func clear(accountScope: String) {
guard !accountScope.isEmpty else { return }
Key.allCases.forEach { defaults.removeObject(forKey: "\(accountScope)_\($0.rawValue)") }
}
private func scopedKey(_ key: Key) -> String {
"\(session.accountCachePrefix)_\(key.rawValue)"
private func scopedKey(_ key: Key) -> String? {
session.accountScopedKey(key.rawValue)
}
}