提问人:Cheok Yan Cheng 提问时间:11/16/2023 最后编辑:Cheok Yan Cheng 更新时间:11/21/2023 访问量:57
WidgetKit iOS 17:长时间空闲后交互式小部件不再响应
WidgetKit iOS 17 : Interactive widget no longer responsive after a long idle time
问:
我开发了一个交互式小部件,如下所示
它正在使用 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()
}
}
交互式小部件运行良好。
但是,在以下情况下,点击小部件没有响应:
- 一夜之后,我们打开iPhone的屏幕,然后点击小部件。
- 几个小时的空闲时间后,我们打开iPhone的屏幕并点击小部件。
以下步骤之一将使小部件再次可用:
- 再次启动并关闭主应用程序。主应用程序将在 期间调用。
WidgetCenter.shared.reloadAllTimelines()
sceneDidEnterBackground
- 按住小部件,选择“编辑小部件”,然后选择所需的待办事项列表。
需要注意的一件事是,我使用的是 .我使用“旧技术”的原因是由于在 iOS 17 AppIntent 中提到的限制,我们如何为 Widget 执行动态数据选择?。IntentTimelineProvider
AppIntentTimelineProvider
但是,我不确定这是否是问题的根本原因。
有谁知道为什么会出现这样的问题?
谢谢。
测试
这是视频录制,显示交互式小部件在 8 小时过夜后无法正常工作。
这是视频录制,显示交互式小部件在启动和关闭主应用程序后再次工作。但是,主应用程序将调用 WidgetCenter.shared.reloadAllTimelines()。因此,我不确定主应用程序重新启动是否导致小部件再次工作,或者导致小部件再次工作。WidgetCenter.shared.reloadAllTimelines()
我正在使用 iOS 版本 17.1.1、iPhone SE 进行测试。
答: 暂无答案
评论