目录


  • 目录
  • 概述
  • 我心中的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 GroupsApp 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