如何解决WidgetKit 不适用于 Intent Handler 提供动态值
我正在尝试实现一个小部件,用户可以在其中通过意图动态选择城市。
我按照苹果在此处提供的分步指南进行操作: https://developer.apple.com/documentation/widgetkit/making-a-configurable-widget
我认为我做的一切都是正确的,但我的结果总是这样:
我可以看到城市列表,但当我选择一个城市时,屏幕变黑,如视频所示,调试崩溃。在模拟器和设备上。
我的目标是在小部件的 getTimeline 中选择城市
这是我使用的代码:
SiriIntent 目标中的 IntentHandler.swift:
import Intents
class IntentHandler: INExtension,DynamicCitySelectionIntentHandling {
func provideCity_paramOptionsCollection(for intent: DynamicCitySelectionIntent,with completion: @escaping (INObjectCollection<City>?,Error?) -> Void) {
let dataSource = PersistenceController.shared.getAllForecastDataCoreData()
let coreDataCities: [City] = dataSource.map { cityCoreData in
let city = City(identifier: "\(cityCoreData.cityID ?? -1)",display: cityCoreData.cityName ?? "")
return city
}
let collection = INObjectCollection(items: coreDataCities)
completion(collection,nil)
}
override func handler(for intent: INIntent) -> Any {
return self
}
}
Widget 类中的部分代码:
import WidgetKit
import SwiftUI
import Combine
import MapKit
typealias Entry = ForecastEntry
struct Provider: IntentTimelineProvider {
let snapshotEntry = Entry(date: Date(),forecastViewModel: .initForPlaceholder())
func placeholder(in context: Context) -> ForecastEntry {
snapshotEntry
}
public func getSnapshot(
for configuration: DynamicCitySelectionIntent,in context: Context,completion: @escaping (Entry) -> Void
) {
let entry = snapshotEntry
completion(entry)
}
public func getTimeline(
for configuration: DynamicCitySelectionIntent,completion: @escaping (Timeline<Entry>) -> Void
) {
let currentDate = Date()
let correctDate = Calendar.current.date(byAdding: .second,value: 150,to: currentDate)
WidgetServiceManager.shared.fetchWeather(forCityId: configuration.city_param?.identifier ?? "") { data in
guard let _data = data else { return }
let entry = Entry(date: currentDate,forecastViewModel: ForecastCardViewModel(weatherModel: _data,isForUserPosition: false))
let timeline = Timeline(entries: [entry],policy: .after(correctDate ?? Date()))
completion(timeline)
}
}
}
@main
struct WeatherAppWidget: Widget {
let kind: String = "WeatherAppWidget"
init() {
}
var body: some WidgetConfiguration {
IntentConfiguration(
kind: kind,intent: DynamicCitySelectionIntent.self,provider: Provider()
) { entry in
WeatherAppWidgetEntryView(entry: entry)
}
.configurationDisplayName("Weather Widget")
.description("Forecasts in your location.")
.supportedFamilies([.systemMedium,.systemSmall])
}
}
.intentdefinition 文件:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。