小部件未更新
Widget is not updating
我有一个应用程序和一个小部件,我想在每天午夜后更新。该应用程序正在更新,但小部件未更新。尝试了时间轴的不同方法,但它不起作用。在模拟器中它工作正常,但当我 运行 我的 phone 上的应用程序时(通过 TestFlight)。你们谁能帮帮我!
小部件代码下方:
...
import WidgetKit
import SwiftUI
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date())
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
let currentDate = Date()
let entries = [
SimpleEntry(date: currentDate)
]
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
}
struct SimpleEntry: TimelineEntry {
let date: Date
}
struct AhackadayWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
Spacer()
Text("Your Hack of the Day")
.font(.footnote)
Divider()
.padding(.horizontal)
.foregroundColor(Color.gray)
Spacer()
Text(mijnPlaatje.mijnKop())
.font(.headline)
.multilineTextAlignment(.center)
.padding(.horizontal)
Image(mijnPlaatje.WidgetPicture())
.resizable()
.aspectRatio(contentMode: .fit)
.clipShape(RoundedRectangle(cornerRadius: 15))
.padding(.horizontal)
Spacer()
}
.widgetURL(URL(string: "myapp://link"))
}
}
@main
struct AhackadayWidget: Widget {
let kind: String = "AhackadayWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
AhackadayWidgetEntryView(entry: entry)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
struct AhackadayWidget_Previews: PreviewProvider {
static var previews: some View {
AhackadayWidgetEntryView(entry: SimpleEntry(date: Date()))
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}
...
应用程序本身的代码,用于调用下方时间线的更新。
该应用程序本身每晚都会进行更新。所以 TimeChangeNotification 正在正常工作。但是,小部件没有更新。
.onReceive(NotificationCenter.default.publisher(
for: UIApplication.significantTimeChangeNotification)) { _ in
ContentView.displayDate = Date()
curDate = myPict.myPicture()
WidgetCenter.shared.reloadAllTimelines()
有
let timeline = Timeline(entries: entries, policy: .atEnd)
您告诉 IOS 尽快重新加载您的小部件。即使没有新数据可用。由于 IOS 正在管理 Widget 更新的时间点,因此它会在开始时大约每 5 - 15 分钟开始更新一次。但随着时间的推移,它会开始花费更多。
TLDR:您很可能超出重新加载的预算。
尝试:
let timeline = Timeline(entries: entries, policy: .never)
有了这个,您的时间轴只会在您的应用需要重新加载时重新加载。
确保您的
WidgetCenter.shared.reloadAllTimelines()
接到电话。
参考:
https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date
编辑:
In the simulator it is working fine, but not when I run the app on my phone (via TestFlight).
在调试器中进行更新不计入预算。
我有一个应用程序和一个小部件,我想在每天午夜后更新。该应用程序正在更新,但小部件未更新。尝试了时间轴的不同方法,但它不起作用。在模拟器中它工作正常,但当我 运行 我的 phone 上的应用程序时(通过 TestFlight)。你们谁能帮帮我!
小部件代码下方:
...
import WidgetKit
import SwiftUI
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date())
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
let entry = SimpleEntry(date: Date())
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
let currentDate = Date()
let entries = [
SimpleEntry(date: currentDate)
]
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
}
struct SimpleEntry: TimelineEntry {
let date: Date
}
struct AhackadayWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
VStack {
Spacer()
Text("Your Hack of the Day")
.font(.footnote)
Divider()
.padding(.horizontal)
.foregroundColor(Color.gray)
Spacer()
Text(mijnPlaatje.mijnKop())
.font(.headline)
.multilineTextAlignment(.center)
.padding(.horizontal)
Image(mijnPlaatje.WidgetPicture())
.resizable()
.aspectRatio(contentMode: .fit)
.clipShape(RoundedRectangle(cornerRadius: 15))
.padding(.horizontal)
Spacer()
}
.widgetURL(URL(string: "myapp://link"))
}
}
@main
struct AhackadayWidget: Widget {
let kind: String = "AhackadayWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
AhackadayWidgetEntryView(entry: entry)
}
.configurationDisplayName("My Widget")
.description("This is an example widget.")
}
}
struct AhackadayWidget_Previews: PreviewProvider {
static var previews: some View {
AhackadayWidgetEntryView(entry: SimpleEntry(date: Date()))
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}
...
应用程序本身的代码,用于调用下方时间线的更新。
该应用程序本身每晚都会进行更新。所以 TimeChangeNotification 正在正常工作。但是,小部件没有更新。
.onReceive(NotificationCenter.default.publisher(
for: UIApplication.significantTimeChangeNotification)) { _ in
ContentView.displayDate = Date()
curDate = myPict.myPicture()
WidgetCenter.shared.reloadAllTimelines()
有
let timeline = Timeline(entries: entries, policy: .atEnd)
您告诉 IOS 尽快重新加载您的小部件。即使没有新数据可用。由于 IOS 正在管理 Widget 更新的时间点,因此它会在开始时大约每 5 - 15 分钟开始更新一次。但随着时间的推移,它会开始花费更多。
TLDR:您很可能超出重新加载的预算。
尝试:
let timeline = Timeline(entries: entries, policy: .never)
有了这个,您的时间轴只会在您的应用需要重新加载时重新加载。
确保您的
WidgetCenter.shared.reloadAllTimelines()
接到电话。
参考: https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date
编辑:
In the simulator it is working fine, but not when I run the app on my phone (via TestFlight).
在调试器中进行更新不计入预算。