iOS App Extension 开发


扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非常大的功能点,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。

例如1:安装了同花顺应用后,打开手机的Widget界面,我们可以看到同花顺提供的自选股实时行情,这个功能就是一个Extension,称为Today Extension。

iOS App Extension 开发_第1张图片

例如2: 安装了搜狗输入法之后,在手机-设置-键盘-添加新键盘后,就可以用搜狗输入法替代原生输入法,这是Custom Keyboard Extension。


iOS App Extension 开发_第2张图片

2.Extension 存在的形式

  • 创建一个Extension之前,需要有一个承载扩展的应用,称为containing app,然后在Containing app中通过Xcode->File->new->target->选择所需的Extension创建。
  • Extension 不能单独存在和发布,随containing app 的安装而安装,随containing app的发布而发布,一个containing app 可以添加多个Extension。
  • Extension 的运行是独立的,containing app 在没有启动的状态下,Extension仍然可以被启动和运行。
  • Extension 可以被系统直接调用,例如下拉通知栏查看同花顺行情时,就是由通知中心启动调用同花顺提供的extension。Extension 也可以被其它应用间接调用,例如在某个应用中调用搜狗输入法。
  • Extension 有自己的Bundle Identifier,需要在开发者账号中注册App id和创建Provisioning profile。Extension 的 Bundle Identifier 必须以containing app的 Bundle Identifier为前缀。
    例如:containing app 的 Bundle Identifier 为
    Extension app 的 Bundle Identifier 必须为

3. Extension 生命周期详解

Extension 不是一个app,所以生命周期和运行环境和app不同。在多数情况下,extension是由用户在某一个app的界面或者某一个活动的控制器中启动,这个启动extension的app被称为host app。Host app 提供extension运行所需的上下文并通过发送一个request的方式开启extension的生命周期,extension在完成host app请求的任务后结束运行。

iOS App Extension 开发_第3张图片
The basic life cycle of an app extension


Because an app extension is not an app, its life cycle and environment are different. In most cases, an extension launches when a user chooses it from an app’s UI or from a presented activity view controller. An app that a user employs to choose an app extension is called a host app. A host app defines the context provided to the extension and kicks off the extension life cycle when it sends a request in response to a user action. An extension typically terminates soon after it completes the request it received from the host app.


  • 一般Extension 主要跟host app 进行通信,两者可以通过extensionContext 直接通信
@interface UIViewController(NSExtensionAdditions)  

// Returns the extension context. Also acts as a convenience method for a view controller to check if it participating in an extension request. 
@property (nonatomic,readonly,retain) NSExtensionContext *extensionContext NS_AVAILABLE_IOS(8_0); 
  • Extension 跟containing app 一般不进行通信。甚至extension在运行的时候,containing app 都没有启动和运行。extension 无法直接读取containing app 的沙盒数据。
  • 只有 Today Extension 可以通过类目NSExtensionContext 中提供的openURL:completionHandler:的方式打开containing app,containing app 不可以通过openURL的方式调用extension。

A Today widget (and no other app extension type) can ask the system to open its containing app by calling the openURL:completionHandler: method of the NSExtensionContext class.

  • Extension 和containing app 可以通过共同读写一个被称为Shared resources的存储区域共享本地存储数据,这是通过App Groups实现的。
iOS App Extension 开发_第4张图片
An app extension can communicate indirectly with its containing app