SecureStorageValue.swift 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. // LoopFollow
  2. // SecureStorageValue.swift
  3. // Created by Jonas Björkert on 2024-09-17.
  4. import Combine
  5. import Foundation
  6. class SecureStorageValue<T: NSObject & NSSecureCoding & Equatable>: ObservableObject {
  7. let key: String
  8. @Published var value: T {
  9. didSet {
  10. guard value != oldValue else { return }
  11. if let data = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true) {
  12. SecureStorageValue.defaults.set(data, forKey: key)
  13. }
  14. }
  15. }
  16. var exists: Bool {
  17. return SecureStorageValue.defaults.object(forKey: key) != nil
  18. }
  19. private static var defaults: UserDefaults {
  20. return UserDefaults.standard
  21. }
  22. init(key: String, defaultValue: T) {
  23. self.key = key
  24. if let data = SecureStorageValue.defaults.data(forKey: key),
  25. let decodedValue = try? NSKeyedUnarchiver.unarchivedObject(ofClass: T.self, from: data)
  26. {
  27. value = decodedValue
  28. } else {
  29. value = defaultValue
  30. }
  31. }
  32. func remove() {
  33. SecureStorageValue.defaults.removeObject(forKey: key)
  34. }
  35. }