65 lines
1.9 KiB
Swift
65 lines
1.9 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
@Observable
|
|
final class CookieManager {
|
|
static let shared = CookieManager()
|
|
|
|
private let cookieKey = "ddys_cookie_string"
|
|
private let defaults = UserDefaults.standard
|
|
|
|
var cookieString: String {
|
|
get { defaults.string(forKey: cookieKey) ?? "" }
|
|
set {
|
|
defaults.set(newValue, forKey: cookieKey)
|
|
applyCookies()
|
|
}
|
|
}
|
|
|
|
var isAuthenticated: Bool {
|
|
!cookieString.isEmpty
|
|
}
|
|
|
|
private init() {
|
|
applyCookies()
|
|
}
|
|
|
|
func applyCookies() {
|
|
guard !cookieString.isEmpty else { return }
|
|
let storage = HTTPCookieStorage.shared
|
|
// 清除旧的 ddys cookies
|
|
if let cookies = storage.cookies(for: URL(string: "https://ddys.io")!) {
|
|
for cookie in cookies {
|
|
storage.deleteCookie(cookie)
|
|
}
|
|
}
|
|
// 解析并设置新 cookies
|
|
let pairs = cookieString.split(separator: ";").map { $0.trimmingCharacters(in: .whitespaces) }
|
|
for pair in pairs {
|
|
let parts = pair.split(separator: "=", maxSplits: 1)
|
|
guard parts.count == 2 else { continue }
|
|
let name = String(parts[0]).trimmingCharacters(in: .whitespaces)
|
|
let value = String(parts[1]).trimmingCharacters(in: .whitespaces)
|
|
let properties: [HTTPCookiePropertyKey: Any] = [
|
|
.name: name,
|
|
.value: value,
|
|
.domain: ".ddys.io",
|
|
.path: "/",
|
|
.secure: "TRUE",
|
|
]
|
|
if let cookie = HTTPCookie(properties: properties) {
|
|
storage.setCookie(cookie)
|
|
}
|
|
}
|
|
}
|
|
|
|
func clearCookies() {
|
|
cookieString = ""
|
|
if let cookies = HTTPCookieStorage.shared.cookies(for: URL(string: "https://ddys.io")!) {
|
|
for cookie in cookies {
|
|
HTTPCookieStorage.shared.deleteCookie(cookie)
|
|
}
|
|
}
|
|
}
|
|
}
|