XuqmGroup-iOSSDK/Sources/XuqmCoreSDK/TokenStore.swift

57 行
1.6 KiB
Swift

2026-04-21 22:07:29 +08:00
import Foundation
import Security
2026-04-21 22:07:29 +08:00
public final class TokenStore: @unchecked Sendable {
private let service = "com.xuqm.sdk.token"
private let account = "auth_token"
2026-04-21 22:07:29 +08:00
public init() {}
2026-04-21 22:07:29 +08:00
public func save(_ token: String) {
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? {
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() {
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
}
}