我正在为 macOS 构建一个小部件,它仅适用于 macOS。并且,它在尝试重新创建另一个timeline
(从getTimeline
函数)后不断崩溃它抛出以下错误:
由于未捕获的异常“NSFileHandleOperationException”而终止应用程序,原因:“*** - [NSConcreteFileHandle fileDescriptor]:无效参数”以未捕获的 NSException 类型异常终止
我相信它是由于缺少方法的实现而产生的onBackgroundURLSessionEvents(matching:_:)
,这引起了我的注意以下文档⬇️
来自苹果文档:
当您的小部件扩展处于活动状态时,例如提供快照或时间线时,它可以启动后台网络请求。该过程类似于应用程序处理此类请求的方式,在后台下载文件中进行了描述。WidgetKit 不会恢复您的应用程序,而是直接激活您的小部件的扩展。要处理网络请求的结果,请在小部件的配置中使用 onBackgroundURLSessionEvents(matching:_:) 修饰符,并执行以下操作:
存储对完成参数的引用。在处理完所有网络事件后调用完成处理程序。
使用标识符参数查找您在发起后台请求时使用的 URLSession 对象。如果您的小部件扩展已终止,请使用标识符重新创建 URLSession。
调用 onBackgroundURLSessionEvents() 后,系统调用您提供给 URLSession 的 URLSessionDelegate 的 urlSession(_:downloadTask:didFinishDownloadingTo:) 方法。当所有事件都已交付后,系统会调用委托的 urlSessionDidFinishEvents(forBackgroundURLSession:) 方法。
要在网络请求完成后刷新小部件的时间线,请从代理的 urlSessionDidFinishEvents 实现中调用 WidgetCenter 方法。完成事件处理后,调用之前存储在 onBackgroundURLSessionEvents() 中的完成处理程序。
问题是urlSessionDidFinishEvents(forBackgroundURLSession:)
仅适用于:
OS 7.0+
Mac Catalyst 13.0+
tvOS 9.0+
watchOS 2.0+
macOS 目标似乎没有等效的想法。那么,我们应该如何设置呢?