widget小插件

一、介绍

因为公司业务需求,让用户可以快速打开APP进入到指定的页面,于是有了用widget小插件的想法,又名Today Extension。widget的开发是非常简单的,这篇文章的目的是方便之前没用做过widget的伙伴快速上手。

1.widget是什么

widget是一种可以让用户快速预览感兴趣的内容的小插件,iOS中位于手机的负一屏,最早出现在iOS8.0,iOS10进行了优化。将部分重要信息展示在widget中,可以让用户在不打开App的情况下查看。与此同时,对widget内部视图添加相应的点击事件,可以与主App进行交互。从这方面看,widget是一个单独的App,它有自己的生命周期。

2.widget与主App的关系

widget的本质是一个target,与主App一样在同一个project下,对项目中的库或某些类可以添加到widget中,这样widget中也能调用主App中的库或类。widget和主App是依赖关系,依赖主App上线,widget没有办法单独上线。

二、开发流程

1.创建widget

首先新建一个项目,然后在项目中创建widget,如图1所示。

图1

找到Today Extension,如图2所示。

图2

创建完成项目目录如图3所示。

图3

因为本人不喜欢storyboard,会删掉该文件,改用纯代码。同时,需要在info.plist文件中做如图4的处理。注意,项目用swift在入口类前面加上项目名,例如这个widget的项目名就是widget,假如该widget是swift版本,则NSExtensionPrincipalClass对应的key则是:widget.TodayController

图4

2.与主App交互

如果widget开发出来只是为了让用户看看信息,而不能和主App进行交互,那么它是没有灵魂的。之前已经说过了widget是一个单独的App,那么肯定不能直接页面跳转了,App之间的跳转通过URL,所以需要在主App中配置跳转的URL,如图5所示。

图5

然后在主App的AppDelegate类中增加一个代理方法,如图6所示。

图6

在主App中加好代理方法后,还需要在widget中添加跳转方法,如图7所示,如此一来即可完成跳转了。

图7

3.数据共享

有时候我们需要使用主App中缓存的数据,因为毕竟widget作为一个小的项目不会做的很复杂,缓存的数据通常来源于主App,由于二者的沙盒路径不同,直接使用主App中的缓存文件比较费事,当然如果要强行访问也是可以做到的。主App和widget的沙盒路径如图8所示。

图8

有兴趣的伙伴可以尝试去访问,application中有很多文件夹,主App的沙盒放在其中之一里面。这里要说的是另一种数据共享方式。通过groupID,找到共享的文件。在使用groupID的时候需要主App和widget都加入到了group中,有关App group配置在后面讲。这里我所使用的groupID为
第一步,在主App的AppDelegate中保存数据,用图9这个方法。

图9

第二步,在widget的TodayViewController里面读取数据,用图10这个方法。

图10

到这里widget的大致玩法就结束了,下面看下几个注意的地方。

4.注意事项

a.在widget中,UIScrollView及其子类,是不支持滚动的,你可以使用UITableView,但遗憾的是不能滚动,这一点苹果需要向安卓学习,安卓是支持滚动的。

b.widget界面右上角的展开和折叠箭头如何出现?
默认情况下是不会出现的,需要设置折叠方式,并且展开和折叠只支持iOS10.0及其以上,代码如图11所示。

图11

第一个方法是监听展开或折叠模式,可以在这个方法里面改变显示的高度,建议布局用约束布局,这样可以自动适应高度。

c.widget的版本号尽量和主App的保持一致,否则第一次上线widget苹果会发邮件警告。

三、证书配置

a.配置App group id,如图12、图13所示。

图12


b.将已经配置好的项目的ID与上述配置好的App group ID关联起来,如图13、图14、图15所示。

图13
图14
图15

其中图13是创建一个groupID,图14是找到你的证书依赖的App ID,图15是将这个App ID与groupID关联起来。图15完成之后,系统会提示你之前通过该App ID所创建的证书不可用,你只需要重新去测试、发布证书编辑一下,然后save即可。以测试证书为例,如图16所示。

图16

c.接下来是在项目中,添加App group,如图17所示。

图17

至于widget的证书配置,与上述一致,也是先创建AppID,然后依赖改AppID创建widget的证书,后面跟上述的步骤一致了,这里就不用说了。只需要注意一点,widget的bundleID的前缀必须是主App的bundleID,举个例子:主App的bundleID是com.zgyx.test,那么widget的bundleID则是com.zgyx.test.xx。在第2节数据共享中,groupID与这里不同,是因为之前的groupID是自动生成的,存取数据使用的groupID必须是配置的groupID,请不要因为上面的groupID和这里的不一样而产生误解。

四、总结

总的来说,widget的开发还是很简单的,希望能帮你节省几个小时的时间,那样这篇文章写出来就是有价值的,后续准备OpenGL系列的文章了,喜欢的小伙伴可以关注一下。

你可能感兴趣的:(widget小插件)