WidgetKitでは独特なライフサイクルから描写のタイミングに制限があり、
従来の方法である非同期では画像を表示することができません。
###解決方法
Data(ContentsOf: url)
を使って予め画像データを読み込んでから描画することでこれを解決することができます。
###サンプル実装
struct SimpleEntry: TimelineEntry {
let date: Date
let configuration: ConfigurationIntent
let url: String
func getImageData() -> UIImage {
if let imageUrl = URL(string: self.url),
let imageData = try? Data(contentsOf: imageUrl),
let image = UIImage(data: imageData) {
return image
}
// 読み込めない時の画像とか
return .init()
}
}
struct widgetEntryView : View {
var entry: Provider.Entry
var body: some View {
Image(uiImage: entry.getImageData())
.resizable()
.aspectRatio(contentMode: .fill)
}
}
###最後に
非同期が使えないのは結構な罠だと思うので気をつけてくださいねー👋