Я пытаюсь создать лучший виджет, я хочу, чтобы виджет обновлялся каждый раз при изменении состояния или уровня заряда батареи. Я знаю, что для обоих необходимо добавить уведомление. Итак, моя логика заключается в том, что при уведомлении об изменении состояния батареи я хочу обновить временную шкалу.
Однако я не могу понять, куда поместить наблюдателя в режиме TimelineProvider или Widget?
struct timeWidgetEntryView : View {
var entry: Provider.Entry
let NC = NotificationCenter.default
init(entry:Provider.Entry) {
self.entry = entry
}
func batteryLevelDidChange(_ notification: Notification) {
UIDevice.current.isBatteryMonitoringEnabled = true
var level = UIDevice.current.batteryLevel
level = level * 100
WidgetCenter.shared.reloadAllTimelines()
NSLog("Level changed / state changed")
}
var body: some View {
VStack {
Text(entry.date, style: .time).foregroundColor(.black).frame(minWidth: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealWidth: 100, maxWidth: 100, minHeight: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealHeight: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxHeight: 50, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
Text("Battery : \(entry.batteryState)").foregroundColor(.black).frame(minWidth: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealWidth: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/, minHeight: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealHeight: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxHeight: 50, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
}
.cornerRadius(10)
.frame(width:.infinity, height:.infinity, alignment: .center)
.onReceive(NotificationCenter.default.publisher(for: UIDevice.batteryStateDidChangeNotification))
{ obj in
// Change key as per your "userInfo"
if let userInfo = obj.userInfo, let info = userInfo["info"] {
print(info)
}
WidgetCenter.shared.reloadAllTimelines()
}
}
}
Но он работает не так, как ожидалось, поэтому мой вопрос: следует ли переместить наблюдателя в поставщик временной шкалы? Если да, то где?