From c06e26dcc8675b3e436826d296fee2d30de34dba Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 14 Jan 2026 12:04:29 -0600 Subject: [PATCH] Update Services Summary: - Sources: update Services Stats: - 2 files changed, 64 insertions(+), 4 deletions(-) --- .../LocalData/Services/StorageRouter.swift | 8 +-- .../Services/UserDefaultsHelper.swift | 60 +++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/Sources/LocalData/Services/StorageRouter.swift b/Sources/LocalData/Services/StorageRouter.swift index fe40baa..43876ab 100644 --- a/Sources/LocalData/Services/StorageRouter.swift +++ b/Sources/LocalData/Services/StorageRouter.swift @@ -86,7 +86,7 @@ public actor StorageRouter: StorageProviding { case .userDefaults(let suite): return try await UserDefaultsHelper.shared.exists(forKey: key.name, suite: suite) 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): return try await KeychainHelper.shared.exists(service: service, key: key.name) 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) 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): guard case let .keychain(accessibility, accessControl) = key.security else { @@ -262,7 +262,7 @@ public actor StorageRouter: StorageProviding { case .userDefaults(let suite): return try await UserDefaultsHelper.shared.get(forKey: key.name, suite: suite) 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): return try await KeychainHelper.shared.get(service: service, key: key.name) @@ -283,7 +283,7 @@ public actor StorageRouter: StorageProviding { case .userDefaults(let suite): try await UserDefaultsHelper.shared.remove(forKey: key.name, suite: suite) 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): try await KeychainHelper.shared.delete(service: service, key: key.name) diff --git a/Sources/LocalData/Services/UserDefaultsHelper.swift b/Sources/LocalData/Services/UserDefaultsHelper.swift index 81a4c85..810a635 100644 --- a/Sources/LocalData/Services/UserDefaultsHelper.swift +++ b/Sources/LocalData/Services/UserDefaultsHelper.swift @@ -20,6 +20,17 @@ actor UserDefaultsHelper { let defaults = try userDefaults(for: suite) 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. /// - Parameters: @@ -31,6 +42,17 @@ actor UserDefaultsHelper { let defaults = try userDefaults(for: suite) 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. /// - Parameters: @@ -41,6 +63,16 @@ actor UserDefaultsHelper { let defaults = try userDefaults(for: suite) 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. /// - Parameters: @@ -52,6 +84,17 @@ actor UserDefaultsHelper { let defaults = try userDefaults(for: suite) 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. /// - Parameter suite: Optional suite name. @@ -61,6 +104,15 @@ actor UserDefaultsHelper { let defaults = try userDefaults(for: suite) 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 @@ -75,4 +127,12 @@ actor UserDefaultsHelper { return defaults } + + private func appGroupDefaults(for identifier: String) throws -> UserDefaults { + guard let defaults = UserDefaults(suiteName: identifier) else { + throw StorageError.invalidAppGroupIdentifier(identifier) + } + + return defaults + } }