从 iOS 17 Observation 迁移至 iOS 16 兼容的 Combine 架构

将最低部署版本降至 iOS 16,以 ObservableObject 替换 @Observable,新增导航与 UI 兼容层,并补充登录冒烟 UI 测试。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-26 10:16:35 +08:00
parent 0314033a7f
commit 703078352c
127 changed files with 2320 additions and 1465 deletions

View File

@ -6,7 +6,7 @@
//
import Foundation
import Observation
import Combine
///
struct AccountSnapshot: Codable, Equatable {
@ -41,13 +41,12 @@ struct AccountSnapshot: Codable, Equatable {
}
}
@Observable
/// 使 UserDefaults
final class AccountSnapshotStore {
@ObservationIgnored private let defaults: UserDefaults
@ObservationIgnored private let key: String
@ObservationIgnored private let encoder: JSONEncoder
@ObservationIgnored private let decoder: JSONDecoder
private let defaults: UserDefaults
private let key: String
private let encoder: JSONEncoder
private let decoder: JSONDecoder
/// UserDefaults
init(

View File

@ -6,14 +6,13 @@
//
import Foundation
import Observation
import Combine
@Observable
/// App
final class AppPreferencesStore {
@ObservationIgnored private let defaults: UserDefaults
@ObservationIgnored private let lastLoginUsernameKey = "suixinkan.preferences.last_login_username"
@ObservationIgnored private let privacyAgreementAcceptedKey = "suixinkan.preferences.privacy_agreement_accepted"
private let defaults: UserDefaults
private let lastLoginUsernameKey = "suixinkan.preferences.last_login_username"
private let privacyAgreementAcceptedKey = "suixinkan.preferences.privacy_agreement_accepted"
/// UserDefaults
init(defaults: UserDefaults = .standard) {
@ -43,4 +42,10 @@ final class AppPreferencesStore {
func loadPrivacyAgreementAccepted() -> Bool {
defaults.bool(forKey: privacyAgreementAcceptedKey)
}
///
func clear() {
defaults.removeObject(forKey: lastLoginUsernameKey)
defaults.removeObject(forKey: privacyAgreementAcceptedKey)
}
}

View File

@ -6,7 +6,7 @@
//
import Foundation
import Observation
import Combine
import Security
/// token Keychain
@ -21,11 +21,10 @@ enum SessionTokenStoreError: LocalizedError {
}
}
@Observable
/// token Keychain API
final class SessionTokenStore {
@ObservationIgnored private let service: String
@ObservationIgnored private let account: String
private let service: String
private let account: String
/// token App Bundle Keychain
init(