iOS App Extension入门
转自简书: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来创建一个应用扩展
开发者可以根据自己的业务需求创建不同的应用扩展,也可以在一个App中创建多个应用扩展。
iOS10开始,Messages扩展可独立于宿主App创建:
创建Messages Application.pngMessages Application将自动创建一个Sticker Pack和Messages Extension。
参考iMessage Apps and Stickers, Part 1 WWDC 2016 第7分钟的介绍。
Xcode会为我们自动生成一些文件,有两种类型:
- 含用户交互界面的
如:Today ExtensionToday Extension.png包含一个ViewController,一个ui和一个plist。
同类型的还有Message Extension(需要Xcode8), Share Extension, Action Extension等。
2.不含用户交互界面的
如:Share Link Extension
包含一个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拥有不同的进程。
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入门的更多相关文章
- 关于报错:'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based
最近在看Extension相关知识的时候,自己写了个小demo 发现[UIApplication sharedApplication]这个方法敲不出来了, 总是报错:'sharedApplicatio ...
- 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 ...
- 揭秘 iOS App Extension 开发 —— Today 篇
转自:http://www.cocoachina.com/ios/20160619/16760.html 本文授权转载,作者:Cyandev(简书) 从 iOS 8 开始,苹果引入了全新的 App E ...
- iOS - App Extension 整体总结
一.App Extension的介绍 App Extension可以让你扩展你APP的自定义功能和内容,使用户可以在与其他应用或者系统进行互动的时候去使用它.app extension即为本文所说的e ...
- iOS app开发入门
https://github.com/qinjx/30min_guides/blob/master/ios.md
- IOS APP开发入门案例
1.创建新项目 2.设计布局,main.storyboard中,在控件库中 3.布局控件关联控制器 4.设置事件或者显示模式 5.编写代码: import UIKit class ViewContro ...
- iOS Application Extension
链接: iOS App Extension入门 iOS10通知及通知拓展Extension使用详解(附Demo) iOS10 通知extension之 Content Extension
- iOS 在Host App 与 App Extension 之间发送通知
如何从你的一个App发送通知给另一个App? (例:搜狗输入法下载皮肤完成后使用皮肤) 注:搜狗输入法是App.而键盘是Extension 当你为你的App 添加 App Extension时,如果想 ...
- App Extension Today
App Extensions 是iOS8新开放的扩展机制,之后不断增加功能.App Extension Programming Guide: Today 不喜欢废话,直接上干货! 一:重要概 ...
随机推荐
- [转载]2.7 UiPath Flowchart的介绍和使用
一.Flowchart的介绍 用于更复杂的业务逻辑. 与序列不同的是, 流程图提供了多个分支逻辑运算符, 可以使用流程图创建复杂的业务流程并以多种方式连接每个活动. 二.在UiPath 使用Flowc ...
- Scrapy简单上手 —— 安装与流程
一.安装scrapy 由于scrapy依赖较多,建议使用虚拟环境 windows下pip安装(不推荐) 1.安装virtualenv pip install virtualenv 2.在你开始项目的文 ...
- vue ui九宫格、底部导航、新闻列表、跨域访问
一. 九宫格 九宫格:在mint-ui组件库基于vue框架 mui不是基于vue框架 只是css/js文件 (1)官方网站下载安装包 (2)copy css js fonts[字体图标] src/l ...
- powerdesigner连接Mysql进行反向工程并生成word文档图文教程
1 软件版本 windows7 64位 powerdesigner 15.1 Mysql 5.1.56 mysql-connector-odbc-3.51.30-winx64 对于mysql-conn ...
- win10 visual studio 2017环境中安装CUDA8
从https://developer.nvidia.com/cuda-toolkit-archive下载CUDA 8 安装 从https://developer.nvidia.com/gamework ...
- hdu 1325 Is It A Tree? (树、node = edge + 1、入度 <= 1、空树)
Is It A Tree?Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- Install gitlab
yum install -y curl policycoreutils-python openssh-server postfix wget wget https://mirrors.tuna.tsi ...
- 模型量化原理及tflite示例
模型量化 什么是量化 模型的weights数据一般是float32的,量化即将他们转换为int8的.当然其实量化有很多种,主流是int8/fp16量化,其他的还有比如 二进制神经网络:在运行时具有二进 ...
- 手动模拟实现Spring IOC功能(基于javaConfig风格)
以下文中spring特指spring frameWork项目,不含其它:如spring cloud等. 作为刚开始研究spring源码的小白,对于spring两大核心功能之一的IOC,虽说大致了解了B ...
- win上找到host文件的方法
在运行的位置输入 C:\WINDOWS\system32\drivers\etc