探索iOS小组件Widget使用心得与常见问题解析

更新:10-29 民间故事 我要投稿 纠错 投诉

一.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()

用户评论

鹿先森,教魔方

我之前也试过做小组件,真的挺容易出问题的

    有15位网友表示赞同!

你很爱吃凉皮

想问问什么坑最常见?希望能参考一下

    有12位网友表示赞同!

暖栀

哎,iOS的小组件好像一直都不是那么稳定吧

    有15位网友表示赞同!

别留遗憾

学习iOS小组件也是一门技术,需要花时间去琢磨

    有7位网友表示赞同!

孤单*无名指

做得好确实很酷炫,可以瞬间了解信息,但是遇到问题就头疼了

    有20位网友表示赞同!

孤街浪途

我看到一些开发者分享的案例,感觉实现难度还挺高

    有5位网友表示赞同!

安陌醉生

最近想尝试做一个小组件,不知道要从哪开始比较好

    有12位网友表示赞同!

执念,爱

希望能有详细的文章讲解如何避免这些坑

    有17位网友表示赞同!

瑾澜

对于新手来说,iOS开发的小组件确实需要克服很多挑战

    有14位网友表示赞同!

仰望幸福

希望官方能加强小组件的功能和稳定性

    有13位网友表示赞同!

自繩自縛

做小组件真的太考验知识储备了

    有5位网友表示赞同!

哭着哭着就萌了°

看标题感觉挺专业的样子,我还在初级阶段呢

    有17位网友表示赞同!

强辩

也许可以分享一些具体的例子,方便理解问题类型

    有6位网友表示赞同!

╯念抹浅笑

如果学习资源比较少的话,就很难突破瓶颈啊!

    有20位网友表示赞同!

我要变勇敢℅℅

iOS小组件还是很有用的功能,希望能更加完善

    有19位网友表示赞同!

滴在键盘上的泪

做应用的小伙伴来说,了解小组件也是必不可少的技能

    有13位网友表示赞同!

有你,很幸福

遇到坑可以找开发者社区帮忙解决?

    有5位网友表示赞同!

﹏櫻之舞﹏

希望以后能看到更多优秀的iOS小组件

    有6位网友表示赞同!

冷眼旁观i

学习新技术确实需要积累经验和实践

    有11位网友表示赞同!

抓不住i

标题听起来很吸引人,期待深入了解!

    有5位网友表示赞同!

【探索iOS小组件Widget使用心得与常见问题解析】相关文章:

1.动物故事精选:寓教于乐的儿童故事宝库

2.《寓教于乐:精选动物故事助力儿童成长》

3.探索动物旅行的奇幻冒险:专为儿童打造的童话故事

4.《趣味动物刷牙小故事》

5.探索坚韧之旅:小蜗牛的勇敢冒险

6.传统风味烤小猪,美食探索之旅

7.探索奇幻故事:大熊的精彩篇章

8.狮子与猫咪的奇妙邂逅:一场跨界的友谊故事

9.揭秘情感的力量:如何影响我们的生活与决策

10.跨越两岸:探索彼此的独特世界

上一篇:购物最佳时机揭秘:双11与全年300减50优惠大比拼 下一篇:深入探讨历史视角下的bdsm:揭示复杂文化现象