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来创建一个应用扩展

创建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的方式显示的)。

时间: 2024-08-28 04:23:27

iOS App Extension入门的相关文章

揭秘 iOS App Extension 开发 —— Today 篇

转自:http://www.cocoachina.com/ios/20160619/16760.html 本文授权转载,作者:Cyandev(简书) 从 iOS 8 开始,苹果引入了全新的 App Extension,涉及到方方面面,例如今日面板.键盘.内容拦截器.分享动作等.但是官方对于 App Extension 的开发指南少之又少,入门起来会有很多坑.所以我准备写一系列文章来帮助大家更好入门 App Extension 的开发,也能少走弯路. 何为 App Extension? 顾名思义,

iOS Application Extension

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

iOS开发日记55-通知栏扩展(App Extension)

今天博主有一个App Extension的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 总览 扩展 (Extension) 是 iOS 8 和 OSX 10.10 加入的一个非常大的功能点,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能.对于 iOS 来说,可以使用的扩展接入点有以下几个: Today 扩展 - 在下拉的通知中心的 "今天" 的面板中添加一个 widget 分享扩展 - 点击分享按钮后将网

史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发

书是人类进步的阶梯. ——高尔基 习大大要求新新人类要有中国梦,鼓励大学生们一毕业就创业.那最好的创业途径是什么呢?就是APP.<构建跨平台APP-jQuery Mobile移动应用实战>就是一本写给没钱没身份没资历的创业小白看的APP书,看完这本书你可以拥有自己的一个APP,不用花钱就能移植到其他移动平台,支持iOS,Android,Windows Phone!!!!!!!!找个最便宜的来练手吧!  小白APP交流Q群:  348632872 清华大学出版社推出的<构建跨平台APP:j

iOS 6 Passbook 入门 1/2

Passbook 是苹果发布的 iOS 6 技术中最火热的一个, 它所带来的开创性超过我们的想象. Passbook 是一些是一个非常棒的组合. 四项独立的技术结合到一起,为 iPhone 用户带来了一个全新的体验: 新的 iOS 框架 PassKit 全新的 Passbook 应用,随着 iOS 一起绑定发布 苹果的 推送通知 服务(这次会保证发送成功) 你自己的服务端代码! Passbook 和你曾经用到过的其他苹果的技术很不同. 让他变得与众不同的是关于一个文件格式的概念. 由你来创建 P

输出Bag中的所有记录为一个json数组---精通android、IOS App应用服务程序开发

书写闭合的json格式内容 {"item": { <chtml> - - </chtml> } ,"tatol":@{item:getLength} } 与内层的标签运行结果共同组织一个完整的json格式文本输出到Android(IOS) App "tatol":@{item:getLength} 为统计记录数 初始化Bag中的记录 同上一博 (您也可以从数据库中查询,如) <esql module=help id=

App Extension编程指南(iOS8/OS X v10.10):常见问题的处理方案

本节由CocoaChina翻译组成员DevTalking (博客)翻译自苹果官方文档App Extension Programming Guide--Handling Common Scenarios一节,敬请勘误.欢迎加入我们的翻译小组,详情请参看:CocoaChina编辑和译者招募! 当编写自定义代码以执行app扩展任务时,你可能需要处理一些其他多种类型扩展也会出现的情况.在这一章节中,我们将帮助你如何应对和处理这些常见的问题. 使用内嵌框架共享代码 你可以创建一个内嵌框架,用于在应用扩展和

做QA的日子——iOS測试入门(四)

坦言,做QA的这半年我没有成长,就算有成长也非常少,我非常难过.和身边的人讲事实上并没有谁能真正理解自己的难过,事实上还是自己不够努力.对自己不够狠,以前认为自己不够幸运,想有一个更好的指路人,事实上这种想法是不正确的,哪有那么多的指路人,遇到了是你万幸.没有遇到你自己就做你自己的指路人.用自己的驱动力驱动自己成长.就算慢一些又如何,当有这种指路人助你一臂之力的时候,也许你会更加珍惜如今所拥有的. 做QA測试,非常多时候是站在后方支持整个团队的,非常有可能非常多时候会被别人看不起.别人会说,ta

App Extension的脱壳办法

App Extension的脱壳办法 从app store下载的app和app extension是加过密的,可以通过otool查看: $ otool -l binary_name | grep crypt cryptoff 16384 cryptsize 294912 cryptid 1 iPhone applications的解密办法 dumpdecrypted 是个出色的app脱壳开源工具,它的原理是:将应用程序运行起来(iOS系统会先解密程序再启动),然后将内存中的解密结果dump写入文