Something went wrong. Try again.
A slopfork of Sam Henri Gold's Twitter client, reskinned like Tweetie 2 / Twitter for iPhone circa 2012. Personal use.
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950import Foundationimport Security
/// Stores the Twitter session cookies as a single generic-password item.enum Keychain { private static let service = "gold.samhenri.Twitter" private static let account = "x-session-cookies"
static func loadCookies() -> [String: 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? guard SecItemCopyMatching(query as CFDictionary, &item) == errSecSuccess, let data = item as? Data else { return nil } return try? JSONDecoder().decode([String: String].self, from: data) }
static func saveCookies(_ cookies: [String: String]) { guard let data = try? JSONEncoder().encode(cookies) else { return } let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: account ] let update: [String: Any] = [kSecValueData as String: data] if SecItemUpdate(query as CFDictionary, update as CFDictionary) == errSecItemNotFound { var insert = query insert[kSecValueData as String] = data insert[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly insert[kSecAttrLabel as String] = "Twitter session" SecItemAdd(insert as CFDictionary, nil) } }
static func deleteCookies() { let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: account ] SecItemDelete(query as CFDictionary) }}