iOS8中的Extension扩展

参考:官方 扩展

 

iOS8SDK中,终于等来了开发者期待已久的应用扩展,允许应用帮助系统扩展自定义功能,去实现一个特定作用域的任务,如自定义键盘、通知中心、Action动作、Share分享等。虽这些在Android上其实都已经被玩坏了,但iOS就是这么任性!

 

扩展如何存在

应用扩展与应用不同,它是主体应用程序(containing app)中一个单独的包,并能生成单独的二进制文件(xxx.appex)。

一个应用允许多个扩展,意义着会有多个appex文件。

在应用打包时,会自动包含应用扩展。

用户在app story安装应用时,应用扩展也会被安装。

但是,大部分扩展都需要用户自行启用它。如通知中心的扩展需要在通知中心中启用,开发者们应该在应用内对用户进行指引操作。

iOS8中的Extension扩展_第1张图片

 

 

扩展如何运行

一个扩展并不是一个app,它的生命周期和运行环境不同于普通app。在生命周期方面,扩展的生命周期从用户在另一个app中选择了扩展开始,一直到扩展完成了用户的请求生命周期结束。

 

调用扩展的应用称为hostapp,对于Widget扩展,host app就是Today。host app会在扩展的有效生命周期内定义一个扩展上下文。通过扩展上下文,hostapp可以和扩展互传数据。注意,扩展只和host app直接通信,扩展与containg app以及containing app与hostapp之间不存在通信关系,如果扩展需要打开containg app,则通过自定义URL scheme方式实现,而不是直接向containgapp发送消息。三者的关系见下图:

 

 

 

 

扩展是一个单独的个体。扩展拥有独立的target,独立的bundle文件,独立的运行进程,独立的地址空间。这意味着即使你的containingapp不在运行,系统也可以启动扩展。或者你的containing app处于挂起状态,同样不会影响扩展的运行。所以系统可以单独对扩展执行优化。

 

扩展与ContaingApp应用间共享数据

在iOS8中,UIViewController新增了一个扩展上下文属性extensionContext,来处理containingapp与扩展之间的通信,上下文的类型是NSExtensionContext,当用户在弹出的Action列表中选择了扩展,扩展将被启动,然后在扩展的viewDidLoad方法中,通过self.extensionContext.inputItems firstObject

 

创建扩展

在创建扩展之前,你需要创建一个用来包含扩展的常规的app项目。这个包含扩展的app被称为containingapp。在创建好containgapp之后,选择File->New->Target菜单,从弹出的对话框中选择一个适当的扩展目标模板。每一个扩展目标模板都包含了与扩展点相关的文件和设置。一个containingapp可以包含多个不同类型的扩展。

每一个扩展目标模板包含一个头文件和实现文件,一个Info.plist文件,以及一个storyboard文件。

 

在上图中也看到了,iOS中可扩展的类型一共有6种,

Share、Action、Today、Photo Editing、Document  Provider、Custom Keyboard

下面我们来一一介绍

 

应用扩展

1Share分享 程序员说

开发者可创建自定义的分享选项。如,发送到QQ,微博等

 

Share扩展模板中视图控制器继承SLComposeServiceViewController类,它为我们提供一些常规行为(字数、图片展示、文本输入、发送和取消按钮)

 

另外,与分享功能生命周期相关属性和方法:

  • presentationAnimationDidFinish()方法可以让我们执行大数据量的分享任务,我们在分享图片时会用到它。
  • contentText是一个String类型的属性,它存储分享者编辑的一些文字描述。
  • didSelectPost()函数在点击Post按钮时调用。它是上传分享数据的入口。
  • didSelectCancel()函数在点击Cancel按钮时调用。
  • isContentValid()函数在分享者编辑的文字有变化时调用。
  • charactersRemaining是一个Int类型的属性,当描述内容有字数限制时,它表示当前还能编写的字数,如果超出字数,该属性展示的字数会变红,并用负数表示已经超出了多少字数。

 

分享内容属性设置

在默认的Info.plist文件里,默认的值是这样的

  • <key>NSExtension</key>
  • <dict>
  • <key>NSExtensionMainStoryboard</key>
  • <string>MainInterface</string>
  • <key>NSExtensionPointIdentifier</key>
  • <string>com.apple.share-services</string>
  • </dict>

默认是扩展可以分享图文并茂,如果想设置可以通过NSExtensionAttributes ->NSExtensionActivationRule来设置

  • <key>NSExtensionAttributes</key>
  • <dict>
  • <key>NSExtensionActivationRule</key>
  • <dict>
  • <key>NSExtensionActivationSupportsImageWithMaxCount</key>
  • <integer>10</integer>
  • <key>NSExtensionActivationSupportsMovieWithMaxCount</key>
  • <integer>1</integer>
  • <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
  • <integer>1</integer>
  • </dict>
  • </dict>

你可能感兴趣的:(ios,extension,应用扩展)