转自简书:http://www.jianshu.com/p/8cf08db29356

 

iOS 10推出了很多新功能,其中有几个高调的变化:通知栏更加实用,电话可以防骚扰,iMessage变得更加有趣和强大,还有就是新一轮的Siri调戏。这 些重大功能让我们更加期待iOS10正式上线!作为开发者,我们也需要不断为自己充电,想把握先机?让我们先来看看它们的基本-App Extension

介绍

应用扩展(App Extension)从iOS 8正式登录iOS平台,开发者可以通过应用扩展为用户提供系统特定的扩展功能。开发者通过扩展点(Extension Point)来指定特定的系统功能,如Today扩展,通知栏扩展,Messages扩展,电话簿扩展等等。

创建应用扩展

应用扩展必须依附于一个宿主App(iOS10有更新,见下文),在现有工程中,选择File->New->Target->Application Extension来创建一个应用扩展

创建Extension.png

开发者可以根据自己的业务需求创建不同的应用扩展,也可以在一个App中创建多个应用扩展。

iOS10开始,Messages扩展可独立于宿主App创建:

创建Messages Application.png

Messages Application将自动创建一个Sticker Pack和Messages Extension。
参考iMessage Apps and Stickers, Part 1 WWDC 2016 第7分钟的介绍。

Xcode会为我们自动生成一些文件,有两种类型:

  1. 含用户交互界面的
    如:Today Extension

    Today Extension.png

    包含一个ViewController,一个ui和一个plist。
    同类型的还有Message Extension(需要Xcode8), Share Extension, Action Extension等。
    2.不含用户交互界面的
    如:Share Link Extension

Share Link Extension.png

包含一个Handler和plist。
同类型的还有Call Directory Extension(需要Xcode8)等。

这两种类型的plist大致相同,除了NSExtension这个属性。
含用户交互界面的应用扩展会定义NSExtensionMainStoryboard,通常会是MainInterface;而不含用户交互界面的应用扩展则会定义NSExtensionPrincipalClass,通常会是XXXHandler(在Share Link Extension的例子中是RequestHandler)。

生命周期

了解应用扩展的生命周期,首先要了解两个概念:
1.容器App (container app)
2.宿主App (host app)

容器App是包含应用扩展的App,就是应用扩展所依赖的App;
宿主App是提供应用扩展界面显示或者功能的App。

其次:
虽然容器App包含应用扩展,但它与应用扩展有着完全不同的生命周期,应用扩展与容器App拥有不同的进程。

应用扩展life cycle

1.用户在宿主App中选择应用扩展(查看其UI或者点击启动其功能)。下面会说明

2.系统启动应用扩展。在此期间,宿主App会调用相关方法启动应用扩展,应用扩展可以通过ExtensionContext的到交互信息。

3.应用扩展执行业务逻辑。有些应用扩展在这个阶段不需要和宿主App进行交互,如Share Link Extension;有些应用扩展则需要和宿主App保持联系以监听用户操作或接受命令,如iMessage Extension。

4.应用扩展执行完毕,系统将其终止。

在应用扩展的生命周期中,甚至不需要与容器App有任何交互。实际上,应用扩展运行时,容器App也不需要处于运行状态(除非主动调用)。

应用扩展响应宿主App请求

我们在上文提到了应用扩展的两种类型,应用扩展的类型不同,响应请求的方式也不同。
有用户交互界面的应用扩展在宿主App中展示的时候启动,并且加载UI。我们可以在ViewController的loadView等方法中通过self.extensionContext(NSExtensionContext 类型)来获取宿主App传给应用扩展的信息。
无用户交互界面的应用扩展在Handler(NSExtensionPrincipalClass指定的Handler)中直接接受来自宿主App的请求,调用方法:

- (void)beginRequestWithExtensionContext:(NSExtensionContext *)context;

当应用扩展响应宿主App,并请求完业务逻辑之后,需要主动告知宿主App。通过调用NSExtensionContext的这两个方法:

- (void)completeRequestReturningItems:(nullable NSArray *)items completionHandler:(void(^ __nullable)(BOOL expired))completionHandler;
- (void)cancelRequestWithError:(NSError *)error;

应用扩展执行completeRequestReturningItems:之后,系统可以随时将其终止,如果是有用户交互界面的应用扩展,执行该方法之后,viewController会立刻dismiss(有用户交互界面的应用扩展通常都是通过presentViewController的方式显示的)。

iOS App Extension入门的更多相关文章

  1. 关于报错:'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based

    最近在看Extension相关知识的时候,自己写了个小demo 发现[UIApplication sharedApplication]这个方法敲不出来了, 总是报错:'sharedApplicatio ...

  2. iOS9中找不到XXX.dylib 与 is unavailable no availabel on ios (app extension) - use view controller 的解决办法

    在 iOS9 中现在找不到 XXX.dylib 了,比如libz.tbd  如果要用到 libz.dylib,可以用下面的办法,来自 Stack Overflow. Go to Build Phase ...

  3. 揭秘 iOS App Extension 开发 —— Today 篇

    转自:http://www.cocoachina.com/ios/20160619/16760.html 本文授权转载,作者:Cyandev(简书) 从 iOS 8 开始,苹果引入了全新的 App E ...

  4. iOS - App Extension 整体总结

    一.App Extension的介绍 App Extension可以让你扩展你APP的自定义功能和内容,使用户可以在与其他应用或者系统进行互动的时候去使用它.app extension即为本文所说的e ...

  5. iOS app开发入门

    https://github.com/qinjx/30min_guides/blob/master/ios.md

  6. IOS APP开发入门案例

    1.创建新项目 2.设计布局,main.storyboard中,在控件库中 3.布局控件关联控制器 4.设置事件或者显示模式 5.编写代码: import UIKit class ViewContro ...

  7. iOS Application Extension

    链接: iOS App Extension入门 iOS10通知及通知拓展Extension使用详解(附Demo) iOS10 通知extension之 Content Extension

  8. iOS 在Host App 与 App Extension 之间发送通知

    如何从你的一个App发送通知给另一个App? (例:搜狗输入法下载皮肤完成后使用皮肤) 注:搜狗输入法是App.而键盘是Extension 当你为你的App 添加 App Extension时,如果想 ...

  9. App Extension Today

     App Extensions 是iOS8新开放的扩展机制,之后不断增加功能.App Extension Programming Guide: Today   不喜欢废话,直接上干货!   一:重要概 ...

随机推荐

  1. .netcore利用DI实现订阅者模式 - xms

    结合DI,实现发布者与订阅者的解耦,属于本次事务的对象主体不应定义为订阅者,因为订阅者不应与发布者产生任何关联 一.发布者订阅者模式 发布者发出一个事件主题,一个或多个订阅者接收这个事件,中间通过事件 ...

  2. maven配置nexus私有仓库

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  3. 深入理解计算机系统 第三章 程序的机器级表示 part3

    这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程” 这一节分为运行时栈.转移控制.数据传送.栈上的局部存储.寄存器中的局部存储空间和递归过程这 6 个小节 其中前 3 小节看懂了一部分内 ...

  4. [LC]876题 Middle of the Linked List (链表的中间结点)(链表)

    ①中文题目 给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式 ...

  5. Cef 因系统时间不正常,导致页面访问空白问题

    当我们的系统时间不正常,比如设置一个日期-1999年9月9日,会引发证书问题. 系统时间不正常-IE有概率能访问 触发NavigateError事件,异常代码INET_E_INVALID_CERTIF ...

  6. MySQL/MariaDB读写分离配置

    DB读写分离描述 数据库的读写分离其实就是为了加减少数据库的压力:数据库的写入操作由主数据库来进行,读取操作由从数据库来进行操作.实现数据库读写分离技术是有很多方法的,在这里我就用一个比较简单的mys ...

  7. 结合源码,重温 Android View 的事件处理知多少 ?

    前言 Android View 的 事件处理在我们的编程中,可谓是无处不在了.但对于大多数人而言,一直都是简单的使用,对其原理缺乏深入地认识. 学 Android 有一段时间了,最近发现,很多基础知识 ...

  8. windows anaconda python3.7 import ssl,psycopg2报错

    使用anaconda,本来是为了减少装第三方模块依赖出错问题的. 但是,今天发现,也是有坑啊. 首先 import ssl 报错,import _ssl 说DLL load failed 解决办法:用 ...

  9. think PHP 查询、更改

    最近公司没有什么新项目,故准备搞搞PHP,正好后端有一些小东西需要搞一下,我就来试试吧. PHP 基于think PHP 3 实现功能: 1.为销售绑定虚拟号码分组(查询可以绑定的分组 -> 绑 ...

  10. 达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

    背景:在使用达梦数据库时,查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段,在达梦中是关键字,SQL报关键词不能使用的错误. 解决办法: 配置达梦安装文件E:\MyJava\dmd ...