认识iOS Application Extension(应用扩展)

来源:互联网 发布:电脑扩音器软件 话筒 编辑:程序博客网 时间:2024/04/30 11:45

扩展
在iOS开发中,Extension经常见于类的拓展,iOS 8发布了一项新的功能:Application Extension,iOS开发者可以通过系统提供的扩展接入点为系统特定的服务提供附加功能。从发布到iOS 10,可使用的扩展点也在不断的丰富:
Action Extension
Audio Unit Extension
Broadcast UI Extension
Call Directory Extension
Custom keyboard Extension
Document Provider Extension
Imessage Extension
Intents UI Extension
Notification Content Extension
Share Extension
Shared Links Extension
Spotlight Index Extension
Sticker Pack Extension
Today Extension等。
为app提供优秀交互和有用的功能,是 iOS应用开发一贯的核心任务。扩展功能也将随app一起打包,用户安装了带有拓展功能的app,可在系统设置里选择是否开启。因此,对于开发者,添加扩展功能,需要在target中添加。
生命周期
扩展的生命周期和包含该扩展的应用容器 (container app) 本身的生命周期是独立的。准确地说,它们是两个独立的进程,默认情况下互相不应该知道对方的存在。扩展需要对宿主 app (host app,即调用该扩展的 app) 的请求做出响应,当然,通过进行配置和一些手段,我们可以在扩展中访问和共享一些容器 app 的资源。
因为扩展依赖于调用它的 app ,因此其生命周期也是由用户在 app 中的行为所决定的。一般来说,用户在 app 中触发了该扩展后,扩展的生命周期就开始了:比如在分享选项中选择了你的扩展,或者向通知中心中添加了你的 widget 等等。而所有的扩展都是由 ViewController 进行定义的,在用户决定使用某个扩展时,其对应的 ViewController 就会被加载,因此你可以像在编写传统 app 的 ViewController 那样获取到诸如 viewDidLoad 这样的方法,并进行界面构建及做相应的逻辑。扩展应该保持功能的单一专注,并且迅速处理任务,在执行完成必要的任务,或者是在后台预约完成任务后,一般需要尽快通过回调将控制权交回给 app,至此生命周期结束。
扩展可以使用的内存是远远低于 app 可以使用的内存的。在内存吃紧的时候,系统更倾向于优先搞掉扩展,而不会是把 app 杀死。因此在开发扩展的时候,也一定需要注意内存占用的限制。另一点是比如像通知中心扩展,你的扩展可能会和其他开发人员的扩展共存,这样如果扩展阻塞了主线程的话,就会引起整个通知中心失去响应。
交互
扩展和容器应用本身并不共享一个进程,但是作为扩展,其实是主体应用功能的延伸,肯定不可避免地需要使用到应用本身的逻辑甚至界面。在这种情况下,我们可以使用 iOS 8 引入的自制 framework 的方式来组织需要重用的代码,这样在链接 framework 后 app 和扩展就都能使用相同的代码了。
另一个常见需求就是数据共享,即扩展和应用互相希望访问对方的数据。这可以通过开启 App Groups 和进行相应的配置来开启在两个进程间的数据共享。这包括了使用 NSUserDefaults 进行小数据的共享,或者使用 NSFileCoordinator 和 NSFilePresenter 甚至是 CoreData 和 SQLite 来进行更大的文件或者是更复杂的数据交互。另外,一直以来的自定义的 url scheme 也是从扩展向应用反馈数据和交互的渠道之一。

0 0