本文所用到的 Demo 能够在这里下载: github.com/zhenyunzhan…

一、创立Widget Extension

1、创立Widget Target

点击 Project —> 增加新的Target —> 查找Widget Extension —> 点击Widget Extension —> 点击 Next

Widget开发流程

2、增加装备信息

Include Configuration Intent 是创立 intentdefinition 文件用的,能够让用户动态装备组件,能够先不勾选,后期能够手动创立

Widget开发流程

3、增加Widget

创立好之后就能够运转程序,程序运转完结之后,长按主屏幕进入修正状况,点击主屏幕右上方增加按钮,找到程序,就能够增加Widget,简略体验下了

二、大致了解 Widget 文件

检查创立完 Widget Extension 后默认生成的 xxxx Widget.swift 文件,Xcode 为咱们生成了 Widget 所需的模版代码,如下这个文件

Widget开发流程

widget的进口 @main标识的部分

Widget开发流程

view EntryView 是咱们实际展现的UI

Widget开发流程

数据 Entry 是用来携带widget展现需求的数据

Widget开发流程

Provider Timeline的提供目标,包括TimelineEntry & ReloadPolicy,用来后续改写 Widget 内容

Widget开发流程

三、开发

以Demo为例,做一个展现古诗内容的Widget,间隔一段时刻后主动更新widget内容,而且能够主动挑选古诗内容来跟新Widget,比方如下:

展现古诗内容 -> 长按后可修正小组件 -> 进入挑选界面 -> 挑选并更新

四、静态装备 StaticConfiguration

创立完 Widget Extension Target之后,体系会给咱们创立好一个Widget的开发模板

1、TimelineEntry

自己创立的模型作为参数,模型 (itemModel) 用 swift 或者 OC创立均可

Widget开发流程

2、界面款式

界面有三种尺度的类型,每种尺度还能够预备不同的布局,另外界面填充的数据就来源于 TimelineEntry

Widget开发流程

3、Timeline时刻线

完成 TimelineProvider 协议 getTimeline 办法,主要是构建 Entry 和 reloadPolicy,用这两个参数初始化 Timeline ,之后再调用completion回调,回调会走到 @main ,去更新 Widget 内容。

demo中是每次改写 Timeline ,创立一个 Entry, 则更新一次主屏幕的 Widget 内容, 改写间隔为 60 分钟,留意:

  • atEnd 一切的entry履行完之后,再次调用 getTimeline 结构数据

  • after(date) 不论这次结构的entry 是否履行完,等体系时刻抵达date之后,就会在调用getTimeline

  • never 最终一个 entry 展现结束之后 Widget 就会一直坚持那个 entry 的显现内容

Widget开发流程

开发完结后,能够运转代码,试一下作用,此刻的更新时刻有点长,能够改为 5 秒后再试。

五、动态装备 IntentConfiguration

程序运转到这里,有的会想,怎么完成修正小组件功能,动态装备 widget 的显现内容呢?

Widget开发流程

1、创立 intentdefinition 文件

command + N 组合键创立新 File —> 查找 intent

Widget开发流程

挑选xxx.intentdefinition文件 —>点击下方 + ,挑选intent创立 —> 对intent命名

Widget开发流程

Widget开发流程

这个 intent 文件包括了你一切的(intents),经过这个文件编译到你的app中,体系将能够读取你的 intents ,一旦你界说了一个intent文件,Xcode也会为你生成一个intent类别

2、能够增加到 intent 中的参数类型

参数类型有多种,下方为一些示例 参数类型分别为:String、Boolean、Integer时的展现

Widget开发流程

你也能够用自己界说的类型去设置,参数也支持多个值

Widget开发流程

3、如何为小组件增加丰厚的装备

a、确认装备目标

以这个demo为例,小组件只能显现一首古诗,可是app中有很多首古诗,这就能够创立多个 古诗 组件,然后经过动态装备,每个小组件想要显现不同的古诗。这样的比方还有很多,比方某个人有多张银行卡,每个组件显现不同银行卡余额

Widget开发流程

b、装备intent文件

category选项设置为View,然后勾选下图中的选项,现在咱们能够只重视小组件选项,将方便指令的勾选也取消,如下图

Widget开发流程

c、intent增加参数

使用参数列表中的 + 按钮,增加一个参数

Widget开发流程

Type类型能够挑选自界说的type

Widget开发流程

参数增加完后,体系会在ClickBtnIntent类中生成相应的特点

Widget开发流程

随后ClickBtnIntent 的实例将在运转时传递到 小组件扩展中,让你的小组件知道用户装备了什么,以及要显现什么

Widget开发流程

d、代码中的更改

StaticConfiguration 切换为 IntentConfiguration,相应的provider也改为IntentTimelineProvider,provider就不上截图了,能够去demo中的ClickBtn.swift文件检查

Widget开发流程

现在运转APP,然后长按古诗小组件,挑选修正小组件,会弹出带有Btn Type的参数,点击Btn Type一栏弹出带有查找的列表页面。 作用如下:

Widget开发流程

显现的Btn Type便是下图中框选Display Name,自己能够随便起名字,中英文均可

Widget开发流程

现在,带有查找的列表页面是一个空白页面,假如想要使其有数据,则要都选Dynamic Options复选框,为其增加动态数据

Widget开发流程

e、如何为列表增加动态数据?

勾选了Dynamic Options复选框,体系会主动生成一个ClickBtnIntentHandling协议,能够点开ClickIntent类去检查,现在有了intent文件,有了新的可恪守协议,就需求有一个Extension去恪守协议,完成协议里面的办法,为查找列表提供数据

  • 点击Project —> 新建target —> 查找intent —> 挑选 Intents Extentsion

Widget开发流程

Widget开发流程

  • 贴上类的办法,以及办法对应的作用图

Widget开发流程

f、留意点

完成IntentHandler时,Xcode会报找不到ClickBtnIntentHandling这个协议的错误,

  • 引入头文件 Intents
  • 需求将下图所标的地方做下修正

Widget开发流程

六、APP创立多个Widget

这个比较简略,按照demo中的比方处理一下就能够,如下图:

Widget开发流程

现在测验,最多能够同时创立五个不同的Widget