Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>

This commit is contained in:
Matt Bruce 2026-01-14 12:04:29 -06:00
parent 6c3712e883
commit 1648e36512
2 changed files with 64 additions and 4 deletions

View File

@ -86,7 +86,7 @@ public actor StorageRouter: StorageProviding {
case .userDefaults(let suite): case .userDefaults(let suite):
return try await UserDefaultsHelper.shared.exists(forKey: key.name, suite: suite) return try await UserDefaultsHelper.shared.exists(forKey: key.name, suite: suite)
case .appGroupUserDefaults(let identifier): case .appGroupUserDefaults(let identifier):
return try await UserDefaultsHelper.shared.exists(forKey: key.name, suite: identifier) return try await UserDefaultsHelper.shared.exists(forKey: key.name, appGroupIdentifier: identifier)
case .keychain(let service): case .keychain(let service):
return try await KeychainHelper.shared.exists(service: service, key: key.name) return try await KeychainHelper.shared.exists(service: service, key: key.name)
case .fileSystem(let directory), .encryptedFileSystem(let directory): case .fileSystem(let directory), .encryptedFileSystem(let directory):
@ -216,7 +216,7 @@ public actor StorageRouter: StorageProviding {
try await UserDefaultsHelper.shared.set(data, forKey: key.name, suite: suite) try await UserDefaultsHelper.shared.set(data, forKey: key.name, suite: suite)
case .appGroupUserDefaults(let identifier): case .appGroupUserDefaults(let identifier):
try await UserDefaultsHelper.shared.set(data, forKey: key.name, suite: identifier) try await UserDefaultsHelper.shared.set(data, forKey: key.name, appGroupIdentifier: identifier)
case .keychain(let service): case .keychain(let service):
guard case let .keychain(accessibility, accessControl) = key.security else { guard case let .keychain(accessibility, accessControl) = key.security else {
@ -262,7 +262,7 @@ public actor StorageRouter: StorageProviding {
case .userDefaults(let suite): case .userDefaults(let suite):
return try await UserDefaultsHelper.shared.get(forKey: key.name, suite: suite) return try await UserDefaultsHelper.shared.get(forKey: key.name, suite: suite)
case .appGroupUserDefaults(let identifier): case .appGroupUserDefaults(let identifier):
return try await UserDefaultsHelper.shared.get(forKey: key.name, suite: identifier) return try await UserDefaultsHelper.shared.get(forKey: key.name, appGroupIdentifier: identifier)
case .keychain(let service): case .keychain(let service):
return try await KeychainHelper.shared.get(service: service, key: key.name) return try await KeychainHelper.shared.get(service: service, key: key.name)
@ -283,7 +283,7 @@ public actor StorageRouter: StorageProviding {
case .userDefaults(let suite): case .userDefaults(let suite):
try await UserDefaultsHelper.shared.remove(forKey: key.name, suite: suite) try await UserDefaultsHelper.shared.remove(forKey: key.name, suite: suite)
case .appGroupUserDefaults(let identifier): case .appGroupUserDefaults(let identifier):
try await UserDefaultsHelper.shared.remove(forKey: key.name, suite: identifier) try await UserDefaultsHelper.shared.remove(forKey: key.name, appGroupIdentifier: identifier)
case .keychain(let service): case .keychain(let service):
try await KeychainHelper.shared.delete(service: service, key: key.name) try await KeychainHelper.shared.delete(service: service, key: key.name)

View File

@ -21,6 +21,17 @@ actor UserDefaultsHelper {
defaults.set(data, forKey: key) defaults.set(data, forKey: key)
} }
/// Stores data in App Group UserDefaults.
/// - Parameters:
/// - data: The data to store.
/// - key: The key to store the data under.
/// - appGroupIdentifier: App Group identifier.
/// - Throws: `StorageError.invalidAppGroupIdentifier` if the identifier is invalid.
public func set(_ data: Data, forKey key: String, appGroupIdentifier: String) throws {
let defaults = try appGroupDefaults(for: appGroupIdentifier)
defaults.set(data, forKey: key)
}
/// Retrieves data from UserDefaults. /// Retrieves data from UserDefaults.
/// - Parameters: /// - Parameters:
/// - key: The key to retrieve. /// - key: The key to retrieve.
@ -32,6 +43,17 @@ actor UserDefaultsHelper {
return defaults.data(forKey: key) return defaults.data(forKey: key)
} }
/// Retrieves data from App Group UserDefaults.
/// - Parameters:
/// - key: The key to retrieve.
/// - appGroupIdentifier: App Group identifier.
/// - Returns: The stored data, or nil if not found.
/// - Throws: `StorageError.invalidAppGroupIdentifier` if the identifier is invalid.
public func get(forKey key: String, appGroupIdentifier: String) throws -> Data? {
let defaults = try appGroupDefaults(for: appGroupIdentifier)
return defaults.data(forKey: key)
}
/// Removes data from UserDefaults. /// Removes data from UserDefaults.
/// - Parameters: /// - Parameters:
/// - key: The key to remove. /// - key: The key to remove.
@ -42,6 +64,16 @@ actor UserDefaultsHelper {
defaults.removeObject(forKey: key) defaults.removeObject(forKey: key)
} }
/// Removes data from App Group UserDefaults.
/// - Parameters:
/// - key: The key to remove.
/// - appGroupIdentifier: App Group identifier.
/// - Throws: `StorageError.invalidAppGroupIdentifier` if the identifier is invalid.
public func remove(forKey key: String, appGroupIdentifier: String) throws {
let defaults = try appGroupDefaults(for: appGroupIdentifier)
defaults.removeObject(forKey: key)
}
/// Checks if a key exists in UserDefaults. /// Checks if a key exists in UserDefaults.
/// - Parameters: /// - Parameters:
/// - key: The key to check. /// - key: The key to check.
@ -53,6 +85,17 @@ actor UserDefaultsHelper {
return defaults.object(forKey: key) != nil return defaults.object(forKey: key) != nil
} }
/// Checks if a key exists in App Group UserDefaults.
/// - Parameters:
/// - key: The key to check.
/// - appGroupIdentifier: App Group identifier.
/// - Returns: True if the key exists.
/// - Throws: `StorageError.invalidAppGroupIdentifier` if the identifier is invalid.
public func exists(forKey key: String, appGroupIdentifier: String) throws -> Bool {
let defaults = try appGroupDefaults(for: appGroupIdentifier)
return defaults.object(forKey: key) != nil
}
/// Gets all keys in UserDefaults for a given suite. /// Gets all keys in UserDefaults for a given suite.
/// - Parameter suite: Optional suite name. /// - Parameter suite: Optional suite name.
/// - Returns: An array of all keys. /// - Returns: An array of all keys.
@ -62,6 +105,15 @@ actor UserDefaultsHelper {
return Array(defaults.dictionaryRepresentation().keys) return Array(defaults.dictionaryRepresentation().keys)
} }
/// Gets all keys in App Group UserDefaults.
/// - Parameter appGroupIdentifier: App Group identifier.
/// - Returns: An array of all keys.
/// - Throws: `StorageError.invalidAppGroupIdentifier` if the identifier is invalid.
public func allKeys(appGroupIdentifier: String) throws -> [String] {
let defaults = try appGroupDefaults(for: appGroupIdentifier)
return Array(defaults.dictionaryRepresentation().keys)
}
// MARK: - Private Helpers // MARK: - Private Helpers
private func userDefaults(for suite: String?) throws -> UserDefaults { private func userDefaults(for suite: String?) throws -> UserDefaults {
@ -75,4 +127,12 @@ actor UserDefaultsHelper {
return defaults return defaults
} }
private func appGroupDefaults(for identifier: String) throws -> UserDefaults {
guard let defaults = UserDefaults(suiteName: identifier) else {
throw StorageError.invalidAppGroupIdentifier(identifier)
}
return defaults
}
} }