keys-ios-integration/Sources/KeysForAll/Protocols/KeyStorage.swift
2025-07-22 01:42:57 -07:00

97 lines
No EOL
2.6 KiB
Swift

//
// KeyStorage.swift
// KeysForAll
//
// Protocol for key storage implementations
//
import Foundation
/// Protocol for storing and retrieving key data
public protocol KeyStorage {
/// Get the current key count
func getKeyCount() -> Int
/// Set the key count
func setKeyCount(_ count: Int)
/// Get whether key gating is enabled
func isKeyGatingEnabled() -> Bool
/// Set whether key gating is enabled
func setKeyGatingEnabled(_ enabled: Bool)
/// Get all stored keys
func getStoredKeys() -> [String]
/// Add a key
func addKey(_ key: String)
/// Remove a key
func removeKey(_ key: String)
/// Clear all data
func clear()
}
/// UserDefaults-based implementation of KeyStorage
public class UserDefaultsKeyStorage: KeyStorage {
private let userDefaults: UserDefaults
private let keyCountKey: String
private let keyGatingEnabledKey: String
private let storedKeysKey: String
public init(suiteName: String? = nil) {
if let suiteName = suiteName {
self.userDefaults = UserDefaults(suiteName: suiteName) ?? .standard
} else {
self.userDefaults = .standard
}
self.keyCountKey = "keysforall.keyCount"
self.keyGatingEnabledKey = "keysforall.keyGatingEnabled"
self.storedKeysKey = "keysforall.storedKeys"
}
public func getKeyCount() -> Int {
return userDefaults.integer(forKey: keyCountKey)
}
public func setKeyCount(_ count: Int) {
userDefaults.set(count, forKey: keyCountKey)
}
public func isKeyGatingEnabled() -> Bool {
return userDefaults.object(forKey: keyGatingEnabledKey) as? Bool ?? true
}
public func setKeyGatingEnabled(_ enabled: Bool) {
userDefaults.set(enabled, forKey: keyGatingEnabledKey)
}
public func getStoredKeys() -> [String] {
return userDefaults.stringArray(forKey: storedKeysKey) ?? []
}
public func addKey(_ key: String) {
var keys = getStoredKeys()
if !keys.contains(key) {
keys.append(key)
userDefaults.set(keys, forKey: storedKeysKey)
setKeyCount(keys.count)
}
}
public func removeKey(_ key: String) {
var keys = getStoredKeys()
keys.removeAll { $0 == key }
userDefaults.set(keys, forKey: storedKeysKey)
setKeyCount(keys.count)
}
public func clear() {
userDefaults.removeObject(forKey: keyCountKey)
userDefaults.removeObject(forKey: keyGatingEnabledKey)
userDefaults.removeObject(forKey: storedKeysKey)
}
}