Hello there,
I stumbled on the issue of observing UserDefaults. My need is to "listening"/observing UD key named "com.apple.configuration.managed"
which is responsible for reading provided MDM external plist. I checked that on the opened app it is possible to provide that plist, and app read this payload correctly.
My problem is to observing that change, when plist is uploading. Requirement is to support iOS 13, this is why I can't use AppStorage. Despite using some similar solutions like:
- someone own implementation of AppStorage,
- and using StackOverflow solutions like this,
it still doesn't work.
My, I feel, the closest one solution was:
@objc dynamic var mdmConfiguration: Dictionary<String, String> {
get { (dictionary(forKey: MDM.ConfigurationPayloadKey) != nil) ? dictionary(forKey: MDM.ConfigurationPayloadKey)! as! Dictionary<String, String> : Dictionary<String, String>() }
set { setValue(newValue, forKey: MDM.ConfigurationPayloadKey)}
}
}
class MDMConfiguration: ObservableObject {
//@Binding private var bindedValue: Bool
@Published var configuration: Dictionary = UserDefaults.standard.mdmConfiguration {
didSet {
UserDefaults.standard.mdmConfiguration = configuration
// bindedValue.toggle()
}
}
private var cancelable: AnyCancellable?
init() {
// init(toggle: Binding<Bool>) {
//_bindedValue = toggle
cancelable = UserDefaults.standard.publisher(for: \.mdmConfiguration)
.sink(receiveValue: { [weak self] newValue in
guard let self = self else { return }
if newValue != self.configuration { // avoid cycling !!
self.configuration = newValue
}
})
}
}
struct ContentView: View {
@State private var isConfigurationAvailable: Bool = false
@State private var showLoadingIndicator: Bool = true
@ObservedObject var configuration = MDMConfiguration()
var body: some View {
GeometryReader { geometry in
let width = geometry.size.width
let height = geometry.size.height
VStack {
Text("CONTENT -> \(configuration.configuration.debugDescription)").padding()
Spacer()
if !configuration.configuration.isEmpty {
Text("AVAILABLE").padding()
} else {
Text("NIL NULL ZERO EMPTY")
.padding()
}
}
}
}
}
But it still doesn't ensure any changes in view, when I manually click on f.e. button, which prints the configuration in the console when it has uploaded, it does it well. Please help, my headache is reaching the zenith. I am a newbie in Swift development, maybe I did something weird and stupid. I hope so :D
Thank in advance!