Application Extension(一):介绍

前言

本篇文章是对 iOS Application Extension 的简介。介绍的内容包括:对
Application Extension 的种类、运行原理、声明周期、之间的通信等。

Application Extension

Application Extension 是从 iOS 8 开始引入的一个新特性。Application Extension扩展可以在原有的应用基础之上,延伸应用的功能,扩大应用的显示内容。可以让用户与其他应用或者系统来进行交互。

我们可以创建扩展来实现某个特定的功能。例如,可以创建分享扩展(Share Extension),来方便用户把有自己喜欢的网页内容分享到自己的社交账号中去。可以创建 Today widget,用来在通知中心展示用户所关心的新闻内容。还可以创建一个自定义键盘扩展(Custom Keyboard Extension),提供给用户来代替系统的键盘,等等。

值得注意的是我们不能直接在 AppStore 提供一个扩展的下载,扩展一定是随着一个应用一起打包提供的。用户在安装了带有扩展的应用后,可以在设置中来选择开启还是关闭你的扩展。而对于开发者来说,提供扩展的方式是在 app 的项目中加入相应的扩展的 target。扩展一般来说是展现在系统级别的 UI 或者是其他应用中的,Apple 特别指出,扩展应该保持轻巧迅速,并且专注功能单一,在不打扰或者中断用户使用当前应用的前提下完成自己的功能点。因为用户是可以自己选择禁用扩展的,所以要注重用户体验,尽量提供优美流畅的扩展方便用户使用。

App Extension 的种类

iOS和MacOS定义了几种类型的应用程序扩展,每个应用程序扩展都只能展示在系统对应的某个特定的功能区域。例如分享、通知中心和iOS键盘。某个可以启用扩展的系统区域称为扩展点。每个扩展点都定义了使用的规范,并提供了使用该区域的API。我们可以根据应用需要提供的功能来选择对应的扩展。下图是在Xcode8 iOS10系统上的Application Extension。

Application Extension

下面介绍几种常见的扩展:

App Extension App Extension 简介
Action (iOS and macOS) 操作或查看来自主机应用程序的内容。
Audio Unit (iOS and macOS) 生成音频流以发送到主机应用程序,或修改来自主机应用程序的音频流,并将其发送回主机应用程序。
Custom Keyboard (iOS) 自定义键盘替换iOS系统键盘,并能在所有的App中使用。
iMessage (iOS) 与短信应用有关的交互
Photo Editing (iOS and macOS) 可以在系统的照片应用中对图片进行编辑
Share (iOS and macOS) 在别的应用中去发布你想要分享的内容
Today (iOS and macOS) 在“通知中心”的“今日”视图中快速查看内容或执行任务。(Today Extension 也称为 Widget)

扩展在iOS 10系统中显示的位置:

App Extension

app extension 与 app 有所区别,extension 必须包含在一个 app 中,每个 extension 是一个独立的二进制文件,运行在 app 中。想要创建一个 extension 必须在某个 app 中添加一个新的 target ,与其他的 target 一样,extension target 有自己的独立配置文件。在一个 app 中可以添加多个 extension target。其中包含 extension 的 app 被称为 containing app

要想发布你的 extension 供用户使用,必须把 containing app 提交到 App Store。当用户安装你的应用的时候,同时也安装了应用里的 extension。用户安装应用之后,想要使用 extension 必须手动打开,是之处于可用的状态,例如,想要使用应用中的 Today Extension,在通知中心中编辑 Widget ,添加 widget 在通知中心今日视图中才会显示。


App Extension 运行原理

App Extension 不是一个独立的 app ,而是一个在特定的功能区域显示的,实现了使用范围广泛的,特定的功能。

App Extension 生命周期

App Extension不是应用,所以它的生命周期和生存环境和应用相比有很大的区别。在大多情况下是在某个应用的弹出的 activity view controller 中选中了某个extension选项,从而启动了 extension。能够提供给用户去启动 extension 的应用被称为 host app。host app 定义了扩展的上下文,在响应用户操作发送请求时启动扩展生命周期,extension 通常在完成了从 host app 中接收到的请求后终止。如下图所示:

The basic life cycle of an app extension
  1. 用户选择了某个 extension
  2. 系统实例化定义在 host app 的请求中的 extension,并在extension 和 host app 之间建立联系。extension 在 host app 的上下文中显示其视图,然后使用其在 host app 中接收到的项目来执行任务。
  3. extension 开始运行,用户可以选择执行或者取消任务,并将其关闭。响应此操作,extension 通过立即执行用户的任务或者必要时启动后台进程来执行 host app 的请求。host app 会撤去 extension的视图,用户会返回到 host app 的之前的上下文中。
  4. extension 执行过它的任务之后,系统终止 extension。
App Extension 的通信
  • extension 主要是与它的 host app 来进行通信:host app 发出请求,然后 extension 进行相应。

  • extension 与它的 containing app 之间没有直接的通信,它们两者之间是两个独立的进程,在 extension 运行的过程中,containing app 可能都没有运行。

  • extension 的 containing app 和 host app 之间没有通信。

在请求相应的通信过程中,系统从 host app 中打开 extension,在host app提供的扩展上下文中传送数据。extension 展示用户页面,执行一些工作,如果有需要,extension可能会将反馈的数据返回给 host app。
extension 与 containing app 之间可以通过 NSExtensionContext 类的 openURL:completionHandler: 方法来间接地进行通信。extension 和它的containing app 可以访问私有定义的共享容器中的共享数据。
如下图所示:

An app extension can communicate indirectly with its containing app


注意事项
  1. extension 不同于 app,有些功能不能使用:
  • 不能使用 sharedApplication对象,及对象包含的一写方法。
  • 不能使用头文件中标记的任何API与NS_EXTENSION_UNAVAILABLE宏或类似的不可用性宏或不可用框架中的任何API
    例如,在iOS 8.0中,HealthKit框架和EventKit UI框架不可用于应用程序扩展。
  • 不能在后台执行耗时的任务。
  • 不能使用 AirDrop 来接收数据。
  1. extension 方便、快捷、高效
    开发者应该给用户提供方便快捷高效的extension,在设计你的extension的时候启动一定要迅速,最好启动的时间在1秒以内。如果extension启动太慢,系统可能会终止你的extension。
    extension 可使用的内存范围远远低于 app 的,在内存紧张的情况下,系统可能会强行终止 extension,因为用户希望回到 app 中,extension只是辅助性的功能。
    所以 extension 应响应迅速、高效运行、占用内存尽可能的少,提供良好的用户体验,这样才能体现 extension的价值。

  2. 流畅简洁的UI设计
    大多数的 extension 需要提供一些用户界面,extension的UI设计应该简洁,并且专注于促进完成单个功能,避免包含不支持扩展的主要任务的无关UI。
    用户通过图标和名称来辨别你的extension,所以你的extension的图标已改和对应的containing app的图标一致,这样用户才知道这个扩展是属于哪个应用的。
    extension的名称应该是简短、方便识别的,一般情况下的命名规范是:<Containing app name>—<App extension name>,这样可以方便用户来管理整个系统的扩展。

  3. 确保你的extension适用于所有的设备
    必须确保你提交的应用 extension 是通用的,必须适用于 iPhone、iPod Touch、iPad。 Xcode中的应用程序扩展模板需要正确配置为通用目标设备系列。

Reference

App Extension Programming Guide

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容