目录
- 目录
- 概述
- 我心中的App Extension
- App Extension的生命周期
- 名词解释
- 生命周期
- App Extension和容器应用的交互
- App Extension与应用间共享数据
- App Extension详解
- 学习资料
概述
扩展(Extension)是iOS 8中引入的一个非常重要的新特性。作为一个iOS开发者,众所周知的在iOS 8之前,每一个app在物理上都是彼此独立的,app之间如果想互访彼此的私有数据,是不是需要绞尽脑汁(如果你打脸的话,那你想象沙盒机制咯 ̄ヘ ̄)。但是Extension出现之后,让app之间的交互成为了可能,用户可以在app中使用其他应用提供的功能,而无需离开当前的应用。
我心中的App Extension
它就是一个扩展,就是一种类似插件机制的玩意。但是App Extension事实上并不是应用的插件,而是系统的插件,所以它的生命周期是由系统来管理的,而且App Extension的载体是App,也就是说如果你只是想做一个简单的Share Extension,也是需要有主程序的。
App Extension的生命周期
名词解释
Containing app
提供扩展的应用是Containing app(也就是容器应用),比喻说你开发了一款应用,它提供了Share Extension,那么你开发的这个应用就是Share Extension的容器应用
Host app
调用扩展的应用叫做Host app(也就是载体应用),比喻说你开发的这款应用,它提供了Extension,那么调用这个Extension的应用就是这个Extension的载体应用,当然容器应用也可以自己调用自己的Extension,那么此时容器应用也是载体应用(有点啰嗦了,别打脸=_= l)。
生命周期
这里先借一张大苹果的图(没图没真相,没图说毛线是吧)
1、用户在载体应用中,选择App Extension;
2、系统启动App Extension,在此期间,载体应用会调用相关的API启动App Extension,App Extension可以通过ExtensionContext得到交互信息;
3、App Extension执行相关的业务逻辑(有些App Extension可能在此阶段不需要和载体应用进行交互,例如Share Link Extension,有些App Extension则需要和载体应用保持联系以监听用户的操作或者接受相关的命令,例如iMessage Extension);
4、App Extension执行完毕,系统会将其终止,该App Extension的生命周期也随之结束。
App Extension和容器应用的交互
App Extension和容器应用本身并不共享一个进程,但是作为扩展,其实是容器应用功能的延伸,肯定不可避免地需要使用到应用本身的逻辑甚至界面。在这种情况下,我们可以使用 iOS 8 新引入的自制 framework 的方式来组织需要重用的代码,这样在链接 framework 后 app 和扩展就都能使用相同的代码了。
另一个常见需求就是数据共享,即扩展和应用互相希望访问对方的数据。这可以通过开启 App Groups 和进行相应的配置来开启在两个进程间的数据共享。这包括了使用 NSUserDefaults 进行小数据的共享,或者使用 NSFileCoordinator 和 NSFilePresenter甚至是 CoreData 和 SQLite 来进行更大的文件或者是更复杂的数据交互。
另外,一直以来的自定义的 url scheme 也是从扩展向应用反馈数据和交互的渠道之一。引用
App Extension与应用间共享数据
对 iOS 开发者来说,沙盒限制了我们在设备上随意读取和写入。但是对于应用和其对应的扩展来说,Apple 在 iOS 8 中为我们提供了一种可能性,,那就是App Groups
。App Groups
为同一个开发者的应用或者扩展定义了一组域,在这个域中同一个 group 可以共享一些资源。对于我们来说,一些简单的数据共享,我们只需要使用同一个group下的NSUserDefaults
就能在主题应用不活跃时候向其中存储数据,然后在扩展初始化时从同一处进行读写。在iOS 8中,UIViewController新增了一个扩展上下文的属性extensionContext
,用这个属性我们可以处理容器应用和扩展之间的通信,这个属性的类型是NSExtensionContext
,我们可以通过它来获取相应的数据,进行返回容器应用的界面等操作。
关于NSExtensionContext的学习
App Extension详解
- Action Extension
待填坑 - Audio Unit Extension
待填坑 - Broadcast UI Extension
待填坑 - Broadcast Upload Extension
待填坑 - Call Directory Extension
待填坑 - Content Blocker Extension
待填坑 - Custom Keyboard Extension
待填坑 - Document Provider
待填坑 - iMessage Extension
待填坑 - Intents Extension
待填坑 - Intents UI Extension
待填坑 - Notification Content Extentsion
待填坑 - Notification Service Extentsion
待填坑 - Photo Editing Extentsion
待填坑 - Share Extension
待填坑 - Shared Links Extension
待填坑 - Spotlight Index Extension
待填坑 - Sticker Pack Extension
待填坑 - Today Extension
待填坑
学习资料
App Extension官方文档
喵神博客地址
NSExtensionContext