import Foundation import Security enum KeychainStore { private static let service = "dev.andros.meshmonitorchat" static func set(_ value: String?, for key: String) { let q: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: key ] SecItemDelete(q as CFDictionary) guard let value, let data = value.data(using: .utf8) else { return } var attrs = q attrs[kSecValueData as String] = data attrs[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock SecItemAdd(attrs as CFDictionary, nil) } static func get(_ key: String) -> String? { let q: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: service, kSecAttrAccount as String: key, kSecReturnData as String: true, kSecMatchLimit as String: kSecMatchLimitOne ] var result: AnyObject? let status = SecItemCopyMatching(q as CFDictionary, &result) guard status == errSecSuccess, let data = result as? Data, let s = String(data: data, encoding: .utf8) else { return nil } return s } }