// Copyright 2023 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. import Foundation private let kPersistentDomainNamePrefix = "com.google.Firebase.Auth." /** @class AuthUserDefaults @brief The utility class to storage data in NSUserDefaults. */ class AuthUserDefaults { /** @var _persistentDomainName @brief The name of the persistent domain in user defaults. */ private let persistentDomainName: String /** @var _storage @brief The backing NSUserDefaults storage for this instance. */ private let storage: UserDefaults static func storage(identifier: String) -> Self { return Self(service: identifier) } required init(service: String) { persistentDomainName = kPersistentDomainNamePrefix + service storage = UserDefaults() } func data(forKey key: String) throws -> Data? { guard let allData = storage.persistentDomain(forName: persistentDomainName) else { return nil } if let data = allData[key] as? Data { return data } return nil } func setData(_ data: Data, forKey key: String) throws { var allData = storage.persistentDomain(forName: persistentDomainName) ?? [:] allData[key] = data storage.setPersistentDomain(allData, forName: persistentDomainName) } func removeData(forKey key: String) throws { guard var allData = storage.persistentDomain(forName: persistentDomainName) else { return } allData.removeValue(forKey: key) storage.setPersistentDomain(allData, forName: persistentDomainName) } /** @fn clear @brief Clears all data from the storage. @remarks This method is only supposed to be called from tests. */ func clear() { storage.setPersistentDomain([:], forName: persistentDomainName) } }