我最近为我的应用启动了一个 iOS 14 小部件。在测试中一切似乎都还可以,但在发布时我的行为不一致。在某些设备上,小部件加载为黑色,在其他设备上,它只加载占位符内容,而在某些设备上,它按预期工作。显示的行为,无论好坏,在添加小部件屏幕和添加到主屏幕时都是一致的。在我的小部件不起作用的设备上,其他小部件可以工作。
Widget 中的内容仅在应用程序中更改某些内容时才会更改,因此我WidgetCenter.shared.reloadAllTimelines()
在调用SceneDelegate 时sceneWillResignActive
调用。预期的行为是,当用户将应用程序置于后台时,小部件将更新。在显示黑色或占位符内容的设备上,此小部件中心更新不起作用,在它起作用的设备上,更新功能按预期工作。
这是我的小部件的代码:
struct ThisWeekProvider: TimelineProvider {
func placeholder(in context: Context) -> ThisWeekEntry {
return ThisWeekEntry(date: Date(), thisWeekJSON: getDefaultTimeSummaryJSON())
}
func getSnapshot(in context: Context, completion: @escaping (ThisWeekEntry) -> ()) {
var thisWeekData = TimeSummaryJSON()
if context.isPreview {
thisWeekData = getThisWeekData()
} else {
thisWeekData = getThisWeekData()
}
let entry = ThisWeekEntry(date: Date(), thisWeekJSON: thisWeekData)
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
let entries: [ThisWeekEntry] = [ThisWeekEntry(date: Date(), thisWeekJSON: getThisWeekData())]
let timeline = Timeline(entries: entries, policy: .after(entries[0].thisWeekJSON.endDate))
completion(timeline)
}
}
struct ThisWeekEntry: TimelineEntry {
let date: Date
let thisWeekJSON: TimeSummaryJSON
}
struct ThisWeekWidgetEntryView : View {
var entry: ThisWeekProvider.Entry
var body: some View {
// Generate View
// Use data from 'entry' to fill widget
}
struct ThisWeekWidget: Widget {
let kind: String = K.thisWeekWidget
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: ThisWeekProvider()) { entry in
ThisWeekWidgetEntryView(entry: entry)
}
.configurationDisplayName("this_week_widget".localized())
.description("this_week_description".localized())
.supportedFamilies([.systemSmall])
}
}
自定义数据类型“TimeSummaryJSON”如下:
struct TimeSummaryJSON: Codable {
var labourIncome: String = "$0.00"
var equipmentIncome: String = "$0.00"
var days: String = "0"
var hours: String = "0"
var endDate: Date = Date()
var settingsFirstDayOfWeek: String = K.monday
var localeFirstDayOfWeek: Bool = false
}
检索数据“getThisWeekData()”的自定义函数如下:
private func getThisWeekData() -> TimeSummaryJSON {
if let encodedData = UserDefaults(suiteName: AppGroup.shared.rawValue)!.object(forKey: K.thisWeek) as? Data {
if let thisWeekJSON = try? JSONDecoder().decode(TimeSummaryJSON.self, from: encodedData) {
return checkExpiryForCurrentWeek(thisWeekJSON)
} else {
print("Decoding Error - Return Default This Week")
return getDefaultTimeSummaryJSON()
}
} else {
print("No Shared Data - Return Default This Week")
return getDefaultTimeSummaryJSON()
}
}
保存和检索数据的过程如下:
sceneWillResignActive
reloadAllTimelines()
我已经相当广泛地查看了我的代码并阅读了无数论坛,似乎我做的一切都是正确的。我错过了什么吗?谁能提出为什么设备之间的行为不一致?我真的被困住了,不知道下一步该尝试什么。
您能提供的任何帮助将不胜感激。
谢谢!
感谢 reddit 上的一些帮助,我终于找到了问题的根源。问题是我使用的图像分辨率太大,大文件大小超过了小部件的 30MB 内存限制。
帮助我的 reddit 用户是这样说的:
'黑色或编辑过的小部件意味着在加载期间您达到了 30 mb 的内存限制。此外,如果您一次重新加载多个小部件,那么您似乎更有可能达到内存预算。
'忘了提及,如果小部件崩溃(由于内存预算不必要),黑色/编辑小部件也可能发生。所以也许你有一些线程问题,或者强制解包一些零的东西。
这是完整讨论的链接:https : //www.reddit.com/r/iOSProgramming/comments/mmo5lf/inconsistent_widget_behaviour_between_devices_in/
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句