ios 小部件在 TimelineProvider 中加载远程图像 url?

Posted

技术标签:

【中文标题】ios 小部件在 TimelineProvider 中加载远程图像 url?【英文标题】:ios widget load remote image url in TimelineProvider? 【发布时间】:2021-01-08 07:05:00 【问题描述】:

我正在我的小部件上显示股票图表(例如:https://example.com/my_img.png)。

作为对 SO & Apple dev 4rum 的调查,我找不到可行的解决方案。

据我所知,Widget 不支持异步图片加载,所以我的方法是在我们 getTimeline() 的时候获取图片,然后将图片数据传递给 Entry 以便稍后显示。

但是我不能让它工作,谁能告诉我如何解决它?

简而言之,它不起作用!:

// Fetch first in getTimeline()
let imgData = Data(
  contentsOf: URL(string: "https://example.com/my_img.png")!
)!

// Then render it later in  View
Image(uiImage: UIImage(data: imgData))

这是我所有的伪代码:

func getTimeline(...) 
  var imageData = nil
  let url: URL = URL(string: "https://example.com/my_img.png")!
  if let imgData:Data = try? Data(contentsOf: url) 
    imageData = imgData
  
  
  var entry = SimpleEntry(...)
  entry.imageData = imageData

  let timeline = Timeline(entries: [entry], policy: .atEnd)
  completion(timeline)


// Some where in the widget i'll show the imageData above
struct FIM_SV_Chart: View 
  let imageData: Data?
  
  var body: some View 
    if imageData != nil, let uiImage = UIImage(data: imageData!) 
      Image(uiImage: uiImage)
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 80, height: 26.0)
     else 
      Image("EmptyChart")
        .resizable()
        .aspectRatio(contentMode: .fit)
        .frame(width: 80, height: 26.0)
    
  


非常感谢。

【问题讨论】:

【参考方案1】:

是我的错,我生成了一个不正确的图片 url 所以 imgData 是 0 字节!

这将起作用:

// Fetch first in getTimeline()
let imgData = Data(
  contentsOf: URL(string: "https://example.com/my_img.png")!
)!

// Then render it later in  View
Image(uiImage: UIImage(data: imgData))

【讨论】:

以上是关于ios 小部件在 TimelineProvider 中加载远程图像 url?的主要内容,如果未能解决你的问题,请参考以下文章

iOS14 Widget小组件开发实践5——网络图片的加载

iOS14 Widget小组件开发(Widget Extension)

今日 iOS 小部件仅在调试时显示

iOS 8 小部件单元测试

如何本地化 iOS 14 小部件的名称 (CFBundleDisplayName)

iOS 14 中设备之间的小部件行为不一致