iOS开发之App Extension (应用扩展)- 入门介绍篇

时间:2024-04-14 14:20:46

1.App Extension简介:

最近更新了iOS10,出来了许多新功能,UI的调整也是一大更新。通知栏的UI也进行了调整,记得之前下过一个在通知中心可以玩的小游戏Steve - The Jumping Dinosaur Widget Game,第一次玩的时候觉得非常神奇,游戏竟然能够在通知栏里面玩!

iOS开发之App Extension (应用扩展)- 入门介绍篇
通知中心小游戏

还有现在通知中心可以显示越来越多的应用扩展,比如下面这个就是水哥手机的通知中心,有天气,中国移动流量等的快速查看。

iOS开发之App Extension (应用扩展)- 入门介绍篇
手机通知中心

以前一直好奇这些功能是怎么实现的,因为项目里面没有碰到过,最近抽时间研究了一下,发现这其实就是本文要讲的App Extension的一种。

App Extensiion是iOS8推出来的一个新特性,extension代表扩展的意思,也就是说我们可以在原有的app上添加一些扩展的内容和功能,但是这些功能并非是在我们的app中使用,而是通过其他的app,或者是iOS系统来使用的,比如我们上面“中国移动流量”的通知中心扩展,就是通过打开系统的通知中心来查看的,而不是在原本的移动掌上营业厅里面的。

2.App Extension的常见类型

应用扩展并不是只有我们上面所说的通知中心扩展,而是有很多种扩展点(Extension Point ,就是一种扩展类型,Apple为每一种扩展点分别加入了API, 所以应用扩展并不是只有一个API,而是每个扩展点都有自己的API),在iOS9,和iOS10中又相继推出了许多新的扩展点,说明这是一个趋势,个人感觉由于iOS系统的原因,很多东西不能够像安卓一样自定义,但是有了应用扩展,以后iOS功能也能越来越开放,灵活。相信应用扩展这个功能,以后许多人项目里面都应该用得上。

iOS8中的扩展点推出来已经很久了,而且相应的功能也非常常用,所以这篇文章会介绍的比较详细,后面我也会写几篇单独的文章来介绍几个常用的扩展点。iOS9和iOS10的扩展也非常有用,但是工作中可能用的相对较少(其实是我不太熟悉。。),所以这篇文章里面介绍的可能稍微少点,但是后面我也会慢慢的去研究的!
  • iOS8中的扩展点:

Today extensions (今日扩展):
Today extension就是我们上面所说的通知中心扩展,因为这个扩展会显示在我们通知中心的 “今天” 这个标签下面。这个扩展的作用很简单,能够让用户更快速方便的看到app最及时的信息,比如中国移动的流量显示,我不用再每次打开移动的app去查看流量,而是直接在通知中心,甚至锁屏界面就可以查看,当然也可以像上面那个小游戏一样,在通知中心直接玩起来,而不用每次都去打开一个游戏程序。

最近更新了一篇关于Today Extension如何实现的文章,有需要的可以看一下:
iOS开发之App Extension(应用扩展)之 -- Today Extension

Share extensions (分享扩展):
分享扩展可以使用户在不同的app之间分享内容。这个功能在iOS5的时候就已经出来了,但是仅限于相册分享图片到tweeter,iOS6中可以分享到Facebook,但是现在,我们可以写分享扩展来分享到我们自己的服务器。
比如我有一张相册中的图片想要通过微信发送给我的朋友,如果没有分享扩展,我只能打开微信与朋友聊天的界面 -> 选择发送图片 -> 到相册中选择图片 -> 然后发送。但是有了分享扩展,我可以直接在相册中点击分享按钮,点击微信,选择好友后,直接分享给好友,而不用打开微信来发送了。

iOS开发之App Extension (应用扩展)- 入门介绍篇
分享扩展

Action extensions(行为扩展):
行为扩展这个名字有点难理解,它可以让用户查看和改变一个app中的某些内容,而不用离开这个app。
比如我在知乎看帖子,碰到一个不会的单词,咋办?如果没有应用扩展,我只能切换到有道词典,输入这个单词来查看,然后再切回知乎,但是现在有了有道词典的行为扩展,我只要复制这个单词,点击共享,在下面 选择有道词典的扩展,就可以不用打开有道词典这个app了,而直接能够显示出翻译结果。

iOS开发之App Extension (应用扩展)- 入门介绍篇
行为扩展

Photo Editing extensions (图片编辑扩展):
图片编辑扩展可以使用户直接在iphone的手机相册中利用第三方图片编辑软件提供的扩展来编辑图片。
比如我现在有一张自拍照,想要编辑一下。如果没有图片编辑扩展的话,我只能打开美图秀秀之类的图片编辑软件,导入图片,编辑保存。有了图片编辑扩展之后,我只需要在系统相册中找到这张图片,点击分享按钮调出菜单,选择第三方的图片编辑扩展,就可以直接进入编辑界面,编辑完直接保存,而不用再打开这个图片编辑软件导入图片来进行编辑了。但是这个扩展仅限于在自带的相册中进行编辑,而不是所有app中图片都可以。

iOS开发之App Extension (应用扩展)- 入门介绍篇
图片编辑扩展

Document Provider extensions (文件提供者扩展):
文件提供者扩展会显示一个文件选择视图给用户,这些选择项可以让用户导入,导出,或者用其他app来打开这个文件。
(这个扩展之前我的理解有问题,写的也是错误的,所以撤销了,网上关于这个扩展的资料非常少,后面补上吧)

Custom Keyboard extensions(自定义键盘扩展):
自定义键盘扩展可以让开发者创建系统键盘之外的自定义键盘,比如搜狗输入法。
这个大家应该都很清楚了,水哥之前虽然没用过iphone,但是在iOS8之前应该是没有第三方输入法的,自从iOS增加了自定义键盘扩展之后,各种第三方输入法都蜂拥而至。

  • iOS9中的扩展点:
    网络相关的扩展点,很多的v*n,网络工具等软件都是基于这三个网络扩展点。

    Packet Tunnel Provider extension :
    可以利用这个扩展点来实现客户端的自定义v*n隧道协议。
    App Proxy Provider extension:
    利用这个扩展点可以实现客户端自定义透明网络代理协议。
    Filter Data Provider and the Filter Control Provider extension:
    利用这个扩展点可以实现动态的,基于设备的网络内容过滤。

    Safari相关的扩展点,很多的Safari广告屏蔽软件都是基于下面这两个扩展点

    Shared Links extension:
    利用这个扩展点可以使用户在Safari的分享链接里面看到app的内容
    Content Blocking extension :
    利用这个扩展点,可以给Safari提供一个拦截列表,在这个拦截列表里面你可以描述当用户再使用Safari的时候你想要拦截的内容。

    其他

    Index Maintenance extension:
    利用这个扩展点实现在不重启app的情况下对app内的数据重新建立索引。
    Audio Unit extension:
    这个扩展点允许你的应用提供乐器、声音效果、声音发生器等,它们可以在GarageBand、Logic这类AU宿主应用里使用。扩展点还可以将完整的音频插件模式搬到iOS上并允许你在App Store里销售Audio Units插件。

  • iOS10中的扩展点:

    Call Directory extension:
    Intents extension:
    Intents UI extension:
    Messages extension:
    Notification Content extension:
    Notification Service extension:
    Sticker Pack extension:

    iOS10中又新增了6个扩展点,这些扩展点的加入,使得iOS10功能更加强大。由于iOS10扩展的资料还比较少看到,我也没有做过相关的,所以我在网上找了一篇介绍的非常好的文章,如果对iOS10新增的扩展有兴趣的,大家可以去看看。iOS 10 应用扩展的剧变,对你的 iPhone 有什么影响?

3.App Extension的工作原理,生命周期

  • 工作原理:

    应用扩展本身不是一个app,而只是对于某个app内容和功能的扩展,所以不能够单独的上架AppStore,而是跟随着你的app一起打包,这个包含应用扩展一起打包的app就叫做container app容器app)。虽然应用扩展是包含在container app中打包的,但是运行时它并不是跟你的app在同一个进程上面,而且有可能同一个app extension会同时运行在不同的进程,因为有可能同时有几个程序都打开了这个app extension,这个用来打开某个app Extension的应用就叫做host app宿主应用)。

    当一个应用扩展在运行的时候,它能够直接和host app进行通信,但是无法和container app进行通信,甚至经常在应用扩展运行的时候,你的container app可能都没有打开。比如对于微信分享扩展来说,如果我要从一个新闻软件分享一篇新闻到微信,通过微信的分享扩展,我可以不用打开微信,甚至微信的进程都没有启动,我只要在新闻软件中直接通过扩展分享到微信就可以了,下次打开微信就可以看到。如果一个app extension 一定要和container app 进行通信的时候,可以利用opeURL()或者是 数据共享 (本文只是概念基础介绍,后面会有单独的文章来介绍如何实现)。

  • 生命周期:

    因为应用扩展不是一个完整,独立的app,所以它的生命周期跟我们正常的app并不一样。应用扩展是在用户从其它软件的界面或者系统界面打开它的时候启动,一般都是host app发出一个request,app extension对应的响应这个请求,在response结束之后,app extension的生命周期也就终止了。

4.Info.plist

应用扩展创建之后会有自己的info.plist文件,info.plist文件中包含一个NSExtension作为key的字典,NSExtension中的内容根据每个扩展点的类型而各不相同,但是其中都必须包含NSExtensionPointIdentifier 这个key,对应的是扩展点的类型。NSExtension中还可以通过NSExtensionActivationRule 这个key对应的值来包含什么时候显示这些扩展的规则,通过这些规则,来判定用户什么时候会唤起你的扩展。 还有一个必须声明的是NSExtensionMainStoryboard 和NSExtensionPrincipalClass 中的某一个key,或者同时声明两个,代表的是用storyboard还是class来作为你的应用扩展入口。

5.总结

这篇文章很简单的介绍了一下App Extension(应用扩展)是什么,其实之所以会写这个是因为我在看到很多iOS软件的时候,总会觉得这些功能基于我现在的知识根本不能实现,那别人是怎么实现的呢?(比如通知中心小游戏,v*n软件,Safari广告屏蔽软件),在知道有应用扩展这个功能之后,我就恍然大悟了!所以,这篇文章主要就是给跟我一样,平时没有接触过App Extension的同学来大概的了解一下App Extension是什么,对于那些想要知道某个Extension Point具体实现的同学,可能就要看别的文章了,或者再等待一下,水哥马上会写几篇常用的扩展使用,每一篇都针对单独的一个Extension Point,尽量多写几个吧,因为我自己也很希望深入的了解一下App Extension。

参考:
《苹果官方文档》
iOS新特性
iOS 8 by Tutorials




链接:http://www.jianshu.com/p/771c65731f37