Widget遇到的坑

前言

前段时间开发的Widget也上线了,今天总结下开发以来遇到的一些问题。
先附上demo地址[Widget]https://github.com/moneyYouCai/NewWidget-iOS14

问题

-适配问题


widget尺寸.png

上图可以看到Widget在不同分辨率下的尺寸都是不同,宽高比也是完全不同,这让我们的适配就不会特别的准确。
本人在写的时候是用Widget高度为标准来进行简单适配,以宽度为329的组件为1:1适配点,虽然不是特别好的适配方式,但看起来也较为可以,如果大家有其他更好的适配方式欢迎指正学习。

func RatioLen(_ length: CGFloat) -> CGFloat {
  if iPhoneHeight == 812 {
    return length
  }
  else if iPhoneHeight == 896 {
    return (length * 360 / widgetTargetWidth)
  }
  else if iPhoneHeight == 736 {
    return (length * 348 / widgetTargetWidth)
  }
  else if iPhoneHeight == 667 {
    return (length * 321 / widgetTargetWidth)
  }
  else if iPhoneHeight == 568 {
    return (length * 292 / widgetTargetWidth)
  }
  return length
}

如果App做了适配ipad,对于Widget来说不同考虑很服,因为苹果对与ipad上显示widget 也和上面尺寸是一样的。

-图片加载问题
Widget中的图片下载是同步下载,如果图片数量过多,则组件页面内容显示会特别慢。如果能在图片加载完之后再去刷新widget,则是一种比较合适的办法。
在这里我说一下思路,大家可以一起参考一下。我们在下载图片的时候运用

DispatchQueue.global(qos: .background).async

当图片下载完之后回到主线程中去刷新Widget

DispatchQueue.main.async {
    WidgetCenter.shared.reloadAllTimelines()
}

当然这里要使用一个变量templeImage来判断图片是否加载完成。

-低版本手机打开崩溃问题
这个问题相信大家也都遇到过,在低于iOS14系统的手机上运行会直接崩溃,崩溃原因说是找不到WidgetKit,当然低统是没有WidgetKit这个库的。解决办法其实也很简单,使用canImport,具体代码如下

#if canImport(WidgetKit)
import WidgetKit
#endif

class WidgetReloadData: NSObject {
    @objc public func fetch() {
      if #available(iOS 14.0, *) {
          #if arch(arm64) || arch(i386) || arch(x86_64)
           WidgetCenter.shared.reloadAllTimelines()
          #endif
      }
    }
}

接着把WidgetKit.framework的status设置成Optional就可以了
status.png

-同过Url链接跳转主App崩溃问题
如果url里面有json字符串,直接使用URL(string: url!),一般都会崩溃,需要Encoding

 Link(destination: URL(string: url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!) {
}

笔者最近也还在研究图片加载以及适配问题,希望能和大家一起学习。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。