简介:Today Widget是App Extension的一种,作用是用户在使用iOS或者Mac OS下拉功能时,能够刷新显示一些用户关心的消息,比如看天气状况,查看股票行情,而且Today Widget能实现一些很小的功能,其实可以把他看成是一个阉割版的APP,一个运行在独立进程中的ViewController。
回到Today Widget的讨论中,我们先来看看Today Widget的生命周期:
1、开始 :在用户通过host app点击extension时,系统就会实例化extension应用,这是生命周期的开始。
2、执行任务 :在extension启动以后,开始执行它的使命。
3、终止 :在用户取消任务,或者任务执行结束,或者开启了一个长时后台任务时,系统会将其杀掉。
由此可见,extension就是为了任务而生!
附上一幅图更加详细的描述这一过程:
那到底是谁在控制着Today Widget呢?
我们接着来看一幅图:
上面那副图提到的三者到底是哪三者呢?那就是App Extension、Containing App和Host App,这里解释一下这三者:
1、App Extension:我们现在讨论的Today Widget就是App Extension的一种,还有其他几种也顺便说一下,请看下图,包含名称作用适用情形:
翻译出来就是:
Today(“今天”又称为Widget):可以快速获取更新或者在通知中心的今日视图中执行一项快速任务。
Share(共享):发布到一个共享网站或者与其它应用程序共享内容。
Action(动作):在另一个应用程序的上下文中操作或查看内容。
Photo Editing【照片编辑(仅限于iOS)】:在照片应用程序中编辑照片或视频。
Finder【查找器(仅限于iOS)】:在查找器中直接显示文件同步的状态信息。
Document Provider【文档提供程序(仅限于iOS)】:提供对文件库的访问和管理。
Custom KeyBoard【自定义键盘(仅限于iOS)】:用自定义键盘替代iOS系统键盘,并用于所有的应用程序中。
2、Containing App:字面意思是包含的APP,我们很容易想到我们的App Extension 就是由它产生出来的,但是这样说并不确切。当我们启动Containing App时,Extension也会启动,但是extensions cannot be stand alone apps.也就是说像Today Widget这种Extension并不是一个独立的APP,而需要依附在Containing App中。再看看这几句:
When an extension is running, it doesn’t run in the same process as the container app. Every instance of your extension runs as its own process.当一个Extension启动之后,它是运行在自己的进程中,它并不是Containing App的子进程,但是当Containing App被用户卸载之后,App Extension 自然也就不存在了。
*3、Host App:我们可以理解成调用Extension的APP,比如当我们编写了一个Today Widget运行起来的时候,Today App就是一个Host App,它和Extension的交互比Extension与Containing App的交互更直接,extension和host app之间可以通过extensionContext属性直接通信:
@interface UIViewController(NSExtensionAdditions) <NSExtensionRequestHandling>