2026-04-21 22:07:29 +08:00
|
|
|
import Foundation
|
2026-06-11 12:25:16 +08:00
|
|
|
import Security
|
2026-04-21 22:07:29 +08:00
|
|
|
|
|
|
|
|
public final class TokenStore: @unchecked Sendable {
|
|
|
|
|
|
2026-06-11 12:25:16 +08:00
|
|
|
private let service = "com.xuqm.sdk.token"
|
|
|
|
|
private let account = "auth_token"
|
2026-04-21 22:07:29 +08:00
|
|
|
|
2026-05-23 01:20:57 +08:00
|
|
|
public init() {}
|
|
|
|
|
|
2026-04-21 22:07:29 +08:00
|
|
|
public func save(_ token: String) {
|
2026-06-11 12:25:16 +08:00
|
|
|
delete()
|
|
|
|
|
|
|
|
|
|
guard let data = token.data(using: .utf8) else { return }
|
|
|
|
|
|
|
|
|
|
let query: [String: Any] = [
|
|
|
|
|
kSecClass as String: kSecClassGenericPassword,
|
|
|
|
|
kSecAttrService as String: service,
|
|
|
|
|
kSecAttrAccount as String: account,
|
|
|
|
|
kSecValueData as String: data,
|
|
|
|
|
kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock,
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
SecItemAdd(query as CFDictionary, nil)
|
2026-04-21 22:07:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public func get() -> String? {
|
2026-06-11 12:25:16 +08:00
|
|
|
let query: [String: Any] = [
|
|
|
|
|
kSecClass as String: kSecClassGenericPassword,
|
|
|
|
|
kSecAttrService as String: service,
|
|
|
|
|
kSecAttrAccount as String: account,
|
|
|
|
|
kSecReturnData as String: true,
|
|
|
|
|
kSecMatchLimit as String: kSecMatchLimitOne,
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
var item: CFTypeRef?
|
|
|
|
|
let status = SecItemCopyMatching(query as CFDictionary, &item)
|
|
|
|
|
guard status == errSecSuccess, let data = item as? Data else {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
return String(data: data, encoding: .utf8)
|
2026-04-21 22:07:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public func clear() {
|
2026-06-11 12:25:16 +08:00
|
|
|
delete()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private func delete() {
|
|
|
|
|
let query: [String: Any] = [
|
|
|
|
|
kSecClass as String: kSecClassGenericPassword,
|
|
|
|
|
kSecAttrService as String: service,
|
|
|
|
|
kSecAttrAccount as String: account,
|
|
|
|
|
]
|
|
|
|
|
SecItemDelete(query as CFDictionary)
|
2026-04-21 22:07:29 +08:00
|
|
|
}
|
|
|
|
|
}
|