iOS18上 小组件Widget刷新机制问题,有大佬可以帮忙解答下吗?

383 阅读1分钟

在iOS18.2上,小组件的刷新机制貌似存在问题。在时间线函数上设置多个Entry,期待按照既定的顺序执行。

显示按钮:

var isAudibleArming = false

struct ControlToggleAudibleArmingStyle: ToggleStyle {
    func makeBody(configuration: Configuration) -> some View {
        Image("icon_sound", bundle: Bundle.main).foregroundColor(.clear)
    }
}

Toggle(isOn: isAudibleArming, intent: XXXIntent()) {}.toggleStyle(ControlToggleAudibleArmingStyle())

过程:点击了Button或者Toggle(现象一致)

struct XXXIntent: AppIntent {
    static var title: LocalizedStringResource = "XXXIntent"
    func perform() async throws -> some IntentResult {
        isAudibleArming = true
        return .result()
    }
}

触发了时间线函数:

func timeline(for configuration: EmergencyAlarmWidgetIntent, in context: Context) async -> Timeline<Entry> {
    var entries: [Entry] = []
    let currentDate = Date()
    let alarmModel = alarmModel(for: configuration)

    let entry = Entry(date: currentDate, alarmModel: alarmModel,type: .loading)
    entries.append(entry) //显示loading

    if (isAudibleArming) { //2秒后切换样式
       let entry1 = Entry(date: currentDate.adding(.second, value: 2), alarmModel: alarmModel,type: .bindDevice) 
            entries.append(entry1)
    }
    return Timeline(entries:entries, policy: .atEnd)
 }

实际结果: 在iOS17上一切正常,loading和2秒后切换样式都可以达到效果。但是在ios 18上,发现点击按钮后,立即显示了2秒后的切换样式,loading被一闪而过。