SecureStorageValue.swift 1.2 KB

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