一.widget不走断点
1、由于func getTimeline方法不一定每次运行项目都及时生效,所以有时widget界面刷新了,但是断点没有移动。把xcode升级到12.2就好多了。
2、在主工程中主动调用widget刷新
WidgetCenter.shared.reloadAllTimelines()需要注意的是,该方法需要导入WidgetKit。 WidgetKit只有swift版本,所以如果主项目是OC的话,需要混合调用swift。
3、在主工程中设置断点(如didFinishLaunch),因为主工程是带断点的。运行主项目并设置断点。当您运行主项目小部件时,它也会运行。你会发现小部件中的断点也消失了。魔法
4.老方法:运行主项目再运行widget项目,重新安装APP,清理Xcode,重启Xcode,重启电脑,重启手机
二.widget不刷新,或者刷新不及时
我们都知道widget的刷新是通过func getTimeline来控制的,因为这个方法是由系统控制的。系统会根据widget的频率和类型来决定widget的刷新频率,所以func getTimeline最早的刷新时间是我们手动写的刷新策略,很有可能会导致刷新时间延迟。
另外,手动编写的刷新策略过于频繁,会延迟小组件的刷新。
比如策略是十分钟后刷新
让当前日期=日期()
让entryDate=Calendar.current.date(通过添加:分钟,value: 10,to: currentDate)!
让条目=SimpleEntry(date: 条目日期)
var Entry: [SimpleEntry]=[]
条目.追加(条目)
return Timeline(entries:条目,policy:after(entryDate))policy是刷新策略,有三种方式
.atEnd,当前条目执行后立即刷新。
.after,设置刷新时间
.never,不刷新
EntryDate指定每个条目的刷新时间
虽然第一次添加widget时func getTimeline肯定会运行,但有些机器无法及时刷新。到目前为止还没有找到解决办法。猜测与系统刷新频率有关。
也可以像上面提到的那样在主项目中主动调用WidgetCenter.shared.reloadAllTimelines(),比如主项目切换到后台时进行刷新。
三.widget黑屏
1、无论是添加widget界面还是添加widget到桌面,黑屏都可能是widget崩溃了。单独运行widget扩展看看是否崩溃。
2. func getTimeline方法没有返回。数据错误或网络错误必须返回func getTimeline 的完成闭包。
3、采用为每个widget单独加载widget样式的方案。不要使用一个小部件加载多种小部件样式。这样,当widget没有加载时,系统的占位符文本不知道加载的是哪种widget样式,从而导致黑屏。具体加载方法见。上一篇文章
4.有时是设备问题,尝试更换设备。
四.widget不停刷新
1.连续定位称为
2. func getTimeline方法中的completion闭包被频繁调用,可能存在多个异步调用操作。
例如报错:
由于未捕获的异常“NSFileHandleOperationException”而终止应用程序,reason:“*** -[NSConcreteFileHandle fileDescriptor]:无效参数”
原因:getTimeline的完成闭包只能调用一次
五.调用主项目,三方库
如果主工程是OC,或者widget目标工程中添加了OC文件,则需要添加桥接文件。如果添加.intentdefinition配置文件,需要在桥接文件中引入#import "ConfigurationIntent.h",否则会报错。错误无法在范围内找到类型“ConfigurationIntent”。
如果需要在cocopod中使用其他库,则需要添加新的target,并添加widget扩展中需要使用的库,例如添加AFNetworking:
目标"WidgetExtension"做
# 如果您不想使用动态框架,请注释下一行
使用框架!
pod“AFNetworking”
# WidgetExtension 的Pod
end如果需要主工程中的文件,请在需要使用的.m文件的Target Membership中勾选widgetExtention,这样widget小部件就可以使用这个OC文件了。可能需要进行一些兼容性更改:引入一些缺失的头文件,检查其他关联文件的目标成员资格,并添加小部件关联。检查并编译它。如果没有问题的话,将使用的OC文件添加到桥接文件中并声明,这样swiftUI就可以调用原来的OC主工程文件了。
六.界面混编问题
小部件界面无法使用UIKit 中的任何内容,也无法根据UIViewRepresentable 协议进行桥接。界面只能使用swiftUI来编写。
七.不能高德定位
目前,AMAP定位初始化[[AMapLocationManager alloc] init]会崩溃;报-[CLLocationManager setPausesLocationUpdatesAutomatically:]中的错误Assertion failure,但是系统定位可以获取到经纬度,然后反转地理位置编码
您需要将NSLocationAlwaysAndWhenInUseUsageDescription、NSLocationAlwaysUsageDescription、NSLocationUsageDescription、NSLocationWhenInUseUsageDescription 添加到info.plist。您还需要添加NSLocationAlwaysAndWhenInUseUsageDescription 并将其设置为true 以允许小部件定位。
八.机型适配,swiftUI布局
小部件尺寸.jpeg
这是每个模型中小部件的官方尺寸。然后我发现每个模型中的widget的大小都不一样。和屏幕比例没有关系。这是不成正比的。到屏幕边缘的距离也不同。有系统方法吗?为了获取widget的大小、宽高,根据这个表写了一套获取代码(不是的,下面有直接获取的方法)
枚举WidgetSizeEnum {
案例小
案例媒介
案例大
}
让ScreenWidth=UIScreen.main.bounds.width
让ScreenHeight=UIScreen.main.bounds.height
func WidgetSize(_ widgetType:WidgetSizeEnum) -CGSize {
如果屏幕宽度==320 屏幕高度==568 {
切换小部件类型{
案例.small:
返回CGSize(宽度: 141,高度: 141)
案例.medium:
返回CGSize(宽度: 291,高度: 141)
案例.large:
返回CGSize(宽度: 291,高度: 299)
}
}
如果屏幕宽度==375 屏幕高度==667 {
切换小部件类型{
案例.small:
返回CGSize(宽度: 148,高度: 148)
案例.medium:
返回CGSize(宽度: 322,高度: 148)
案例.large:
返回CGSize(宽度: 322,高度: 324)
}
}
如果屏幕宽度==414 屏幕高度==736 {
切换小部件类型{
案例.small:
返回CGSize(宽度: 159,高度: 159)
案例.medium:
返回CGSize(宽度: 348,高度: 159)
案例.large:
返回CGSize(宽度: 348,高度: 357)
}
}
如果屏幕宽度==375 屏幕高度==812 {
切换小部件类型{
案例.small:
返回CGSize(宽度: 155,高度: 155)
案例.medium:
返回CGSize(宽度: 329,高度: 155)
案例.large:
返回CGSize(宽度: 329,高度: 345)
}
}
如果屏幕宽度==414 屏幕高度==896 {
切换小部件类型{
案例.small:
返回CGSize(宽度: 169,高度: 169)
案例.medium:
返回CGSize(宽度: 360,高度: 169)
案例.large:
返回CGSize(宽度: 360,高度: 376)
}
}
切换小部件类型{
案例.small:
返回CGSize(宽度: 148,高度: 148)
案例.medium:
返回CGSize(宽度: 322,高度: 148)
案例.large:
返回CGSize(宽度: 322,高度: 324)
}
}
让kSmallWidgetWidth=WidgetSize(.small).width
让kMediumWidgetWidth=WidgetSize(.medium).width
让kLargeWidgetWidth=WidgetSize(.large).width
让kSmallWidgetHeight=WidgetSize(.small).height
让kMediumWidgetHeight=WidgetSize(.medium).height
let kLargeWidgetHeight=WidgetSize(.large).height 后来发现有些机型没有包含它,比如iPhone12,min,max。后来翻遍了WidgetKit库,终于找到了系统方法。我哭了。上面写的代码集是免费的。坑,
公共结构TimelineProviderContext {
公共让displaySize: CGSize
}您可以通过小部件的三个方法获取它:placeholder、getSnapshot 和getTimeline。
context.displaySizeswiftUI 布局也存在很多陷阱。下次我会再写一篇详细的文章。
例如
图片("图片名称")
.resizing()
【探索iOS小组件Widget使用心得与常见问题解析】相关文章:
用户评论
我之前也试过做小组件,真的挺容易出问题的
有15位网友表示赞同!
想问问什么坑最常见?希望能参考一下
有12位网友表示赞同!
哎,iOS的小组件好像一直都不是那么稳定吧
有15位网友表示赞同!
学习iOS小组件也是一门技术,需要花时间去琢磨
有7位网友表示赞同!
做得好确实很酷炫,可以瞬间了解信息,但是遇到问题就头疼了
有20位网友表示赞同!
我看到一些开发者分享的案例,感觉实现难度还挺高
有5位网友表示赞同!
最近想尝试做一个小组件,不知道要从哪开始比较好
有12位网友表示赞同!
希望能有详细的文章讲解如何避免这些坑
有17位网友表示赞同!
对于新手来说,iOS开发的小组件确实需要克服很多挑战
有14位网友表示赞同!
希望官方能加强小组件的功能和稳定性
有13位网友表示赞同!
做小组件真的太考验知识储备了
有5位网友表示赞同!
看标题感觉挺专业的样子,我还在初级阶段呢
有17位网友表示赞同!
也许可以分享一些具体的例子,方便理解问题类型
有6位网友表示赞同!
如果学习资源比较少的话,就很难突破瓶颈啊!
有20位网友表示赞同!
iOS小组件还是很有用的功能,希望能更加完善
有19位网友表示赞同!
做应用的小伙伴来说,了解小组件也是必不可少的技能
有13位网友表示赞同!
遇到坑可以找开发者社区帮忙解决?
有5位网友表示赞同!
希望以后能看到更多优秀的iOS小组件
有6位网友表示赞同!
学习新技术确实需要积累经验和实践
有11位网友表示赞同!
标题听起来很吸引人,期待深入了解!
有5位网友表示赞同!