WidgetKit iOS 17:长时间空闲后交互式小部件不再响应

WidgetKit iOS 17 : Interactive widget no longer responsive after a long idle time

提问人:Cheok Yan Cheng 提问时间:11/16/2023 最后编辑:Cheok Yan Cheng 更新时间:11/21/2023 访问量:57

问:

我开发了一个交互式小部件,如下所示

enter image description here

它正在使用 CoreData。

该视图的实现方式如下

struct widget_extensionEntryView : View {
    var body: some View {
        if let nsTodoList = nsTodoList {
            VStack(alignment: .leading, spacing: 1) {
                ...
                ForEach(0..<prefixGoodNSTodoArray.count, id: \.self) { index in
                    ...
                    let todoIntent = TodoIntent(objectIDAsString: objectIDAsString, parentOrder: parentOrder)
                    
                    Button(intent: todoIntent) {
                    }
                }
            }
        }
    }
}

其实现方式如下AppIntent

import Foundation
import AppIntents
import WidgetKit
import CoreData

struct TodoIntent: AppIntent {
    static var title: LocalizedStringResource = "Complete Task"
    static var description: IntentDescription = IntentDescription("Complete selected task")
    
    @Parameter(title: "objectIDAsString")
    var objectIDAsString: String
    
    @Parameter(title: "parentOrder")
    var parentOrder: Int
    
    init() { }
    
    init(objectIDAsString: String, parentOrder: Int) {
        self.objectIDAsString = objectIDAsString
        self.parentOrder = parentOrder
    }
    
    func perform() async throws -> some IntentResult {
        guard let objectID = NSManagedObjectID.from(objectIDAsString) else { return .result() }
        
        guard let nsTodoList = NSTodoListRepository.INSTANCE.getNSTodoList(objectID) else { return .result() }
        
        nsTodoList.toggleChecked(context: CoreDataStack.INSTANCE.viewContext, parentOrder: Int64(parentOrder))
        
        RepositoryUtils.saveContextIfPossible(CoreDataStack.INSTANCE.viewContext)
        
        TodoWidgetOptions.isWrittenByWidgetExtension = true
        
        // Refresh all home widgets.
        // TODO: https://developer.apple.com/forums/thread/721937
        WidgetCenter.shared.reloadAllTimelines()
        
        return .result()
    }
}

交互式小部件运行良好。

但是,在以下情况下,点击小部件没有响应:

  1. 一夜之后,我们打开iPhone的屏幕,然后点击小部件。
  2. 几个小时的空闲时间后,我们打开iPhone的屏幕并点击小部件。

以下步骤之一将使小部件再次可用:

  1. 再次启动并关闭主应用程序。主应用程序将在 期间调用。WidgetCenter.shared.reloadAllTimelines()sceneDidEnterBackground
  2. 按住小部件,选择“编辑小部件”,然后选择所需的待办事项列表。

需要注意的一件事是,我使用的是 .我使用“旧技术”的原因是由于在 iOS 17 AppIntent 中提到的限制,我们如何为 Widget 执行动态数据选择?IntentTimelineProviderAppIntentTimelineProvider

但是,我不确定这是否是问题的根本原因。

有谁知道为什么会出现这样的问题?

谢谢。


测试

这是视频录制,显示交互式小部件在 8 小时过夜后无法正常工作。

enter image description here

这是视频录制,显示交互式小部件在启动和关闭主应用程序后再次工作。但是,主应用程序将调用 WidgetCenter.shared.reloadAllTimelines()。因此,我不确定主应用程序重新启动是否导致小部件再次工作,或者导致小部件再次工作。WidgetCenter.shared.reloadAllTimelines()

enter image description here

我正在使用 iOS 版本 17.1.1、iPhone SE 进行测试。

iOS Swift SwiftUI 小部件套件

评论


答: 暂无答案