Implement token-based root routing, Android-matched login screen, five-slot MainTabBar with scan action, and placeholder tab pages. Co-authored-by: Cursor <cursoragent@cursor.com>
45 lines
879 B
Swift
45 lines
879 B
Swift
//
|
||
// AppStore.swift
|
||
// suixinkan
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// 本地会话存储,与 Android `AppStoreDataSource` 对齐。
|
||
/// 当前以 Token 是否非空判断登录态。
|
||
final class AppStore {
|
||
|
||
static let shared = AppStore()
|
||
|
||
private enum Key {
|
||
static let token = "key_in_token"
|
||
}
|
||
|
||
private let defaults: UserDefaults
|
||
|
||
init(defaults: UserDefaults = .standard) {
|
||
self.defaults = defaults
|
||
}
|
||
|
||
/// 登录 Token。
|
||
var token: String {
|
||
get { defaults.string(forKey: Key.token) ?? "" }
|
||
set { defaults.set(newValue, forKey: Key.token) }
|
||
}
|
||
|
||
/// Token 非空视为已登录。
|
||
var isLoggedIn: Bool {
|
||
!token.isEmpty
|
||
}
|
||
|
||
/// 保存登录 Token。
|
||
func saveToken(_ token: String) {
|
||
self.token = token
|
||
}
|
||
|
||
/// 清除登录态。
|
||
func logout() {
|
||
token = ""
|
||
}
|
||
}
|