转载请注明出处:http://www.cnblogs.com/zhanggui/p/7119572.html

1.前言

这里主要是对App Extension的一些介绍以及详细给大家介绍一下Share Extension,后期会添加其他的Extension介绍。

2.开始

主要对App Extension和Share Extension进行介绍。请继续往下看:

2.1: App Extension的介绍

官方给的说法是:App Extension可以让你扩展你的APP的自定义功能和内容,使用户可以在与其他应用或者系统进行互动的时候去使用它。翻译的不一定准确,这样说可能会好理解:我们平时看到的Widget、微信和QQ的share等等,都是App Extension,下图是一些例子:

其实就是我们经常看到的Widget,但是Widget只是Today Extension,除了Today Extension,还有很多。

一个支持扩展的系统区域叫做一个extension point(扩展点)。每个扩展点的扩展都有自己独有的使用方法和API。你可以根据你的需求来选择不同的扩展。官方API里面提出了一个名词叫:Host app,我们可以把它理解为宿主的App也就是提供应用扩展界面显示或者功能的App。还有一个container app,我们可以把它理解为容器App,就像上图的微信share extension,容器app就是微信。

扩展和app不同,扩展无法单独上架AppStore。尽管你必须使用个app来包含并且分发你的extension,extension也是一个单独的二进制文件,独立于用于传递和分发的container app。

你可以通过File--->New --->Target来创建Extension,它和其他的target一样,它和你的app project组合成为一个产品。一个app可以有一个扩展,也可以有多个扩展。最好的创建扩展的方式就是通过Xcode提供的Extension种类选择自己需要的来创建,里面包含了必要的API以及方法实现。

如果你想让用户去使用你的扩展,那么就需要吧你的containing app发布到AppStore,当用户安装了你的Containing app,扩展也就安装了。不同的扩展启动的方式也不一样,例如Today Extension,你需要Widget来展示到你的通知中心。扩展也不要乱用,扩展的最佳用户体验从来都是希望用户操作更精简、更快速,并且专注于单个任务。

2.1.1: Extension的种类

我们可以在Xcode的File--->New--->Target里面看到不同平台的Extension,包括iOS、watchOS、tvOS、macOS等等。这里主要介绍iOS,主要包括以下几种Extensions:

1.Action Extension:动作扩展,在另一个应用程序的上下文中操作或者查看内容

2.Audio Unit Extension:音频单元扩展

3.Broadcast UI Extension:广播UI 扩展

4.Broadcast Upload Extension:广播上传扩展

5.Call Directory Extension:呼叫目录扩展

6.Content Blocker Extension:内容拦截器扩展

7.Custom Keyboard Extension:键盘扩展,例如第三方的键盘,搜狗输入法,百度输入法等。

8.iMessage Extension:消息的扩展

9.Intents Extension:Intents扩展

10.Intents UI Extension:Intents UI扩展

11.Notification Content Extension:通知内容扩展

12.Notification Service Extension:通知服务扩展

13.Photo Editing Extension:图片编辑扩展,在照片app中编辑照片或者视频

14.Share Extension:分享扩展,发布一个共享网站或者与其他应用共享内容。

15.Shared Links Extension:分享链接扩展

16.Spotlight Index Extension:Spotlight 索引扩展

17.Sticker Pack Extension:贴纸包扩展

18.Today Extension:Today扩展,可以快速获取更新或者在通知中心的近日视图中执行一项快速任务。

等等。也可直接在这里参见更多extension。

2.1.2: App Extensions的生命周期

先上图,估计你已经看到了好多次这张图,恭喜你这次又看到了,因为这个是苹果官方提供的图片。

1.用户选择要使用的App extension

2.系统启动App Extension

3.App Extension 代码运行

4.运行完之后系统kill掉App Extension

这就是App Extension的生命周期,举个例子:

一个Share Extension,在图库里面你选择了一张图片,然后点击分享,选择你的Share Extension(第一步),此时系统会启动你的Share Extension(第二步)。然后你将选择的图片分享到指定的程序(例如微信的发送给朋友)(第三步)。接下来分享页面关闭,系统kill掉了Share Extension。

2.1.3: App Extension的通信方式

App Extension主要的通信是和他的host app(例如微信的Share Extension和微信),来自host app的请求和extension的response。下图你应该也很熟悉(app 扩展直接和host app沟通):

这个展示的就是正在运行的App Extension、host app和containing app之间的关系。可以看出:Containing App和app Extension并没有直接的沟通。甚至有的时候Containing app可以不运行,而App Extension直接运行。Containing app和Host app没有任何的沟通。

在一个典型的request/response中,系统打开代表host app(图库)的extension(微信分享的share extension),把host app提供的数据(图片和选择的好友)输送到extension的context,然后extension展示界面,提供一些功能任务(例如微信的分享到朋友)。

还有一种是app extension可以直接和他的containing app沟通:

例如Today Widget,可以直接告诉系统打开他的Containing app,只需要调用NSExtensionContext的openURL:CompletionHandler:方法即可。

2.1.4: 在App Extension中不可以做的事情

一个app extension不能有以下情况:

1.访问sharedApplication对象。因此不能使用任何该对象的防范

2.使用任何标记NS_EXTENSION_UNAVAILABLE宏的API,或者类似的宏,或者不可用framework里面的API,例如HealthKit framework不能用于app extensions

3.iOS设备访问相机或者麦克风(iMessage app可以访问这些资源,只要在Info.plist里面进行配置使用描述即可)

4.运行一个长时间的后台任务(根据不同平台而异)

5.使用AirDrop接收数据

2.2: Share Extension的简单使用

这里我们以Share Extension为例进行介绍。

2.2.1: 选择正确的Extension Point开始开发

当你创建app extension的时候,可以直接使用Xcode自带的模板创建你需要的Extension。点击File--->New--->Target:

从这里选择符合你需求的Extension,当你创建完毕后,你的项目工程目录就会多一个文件夹:

可以发现多了一个.swift、.storyboard和一个Info.plist。接下来你也会在Scheme里发现一个Extension,而且多了一个以.appex为后缀的Bundle

这里需要注意:

一个app extension必须在architectures build settings 里面包含arm64(ios)或者x86_64(OS X),否则containing app上架的时候将会被拒绝。Xcode默认的Standard architecture包含了64-bit的architecture。

An app extension target must include the arm64 (iOS) or x86_64 architecture (OS X) in its Architectures build settings or it will be rejected by the App Store. Xcode includes the appropriate -bit architecture with its “Standard architectures” setting when you create a new app extension target.

If your containing app target links to an embedded framework, the app must also include -bit architecture or it will be rejected by the App Store.

2.2.2: 来看看默认的App Extension模板

从上面的项目工程目录看,每个extension都包含了一个plist文件、一个视图控制器类和一个默认的user interface,这些都是被extension point定义的。我们先来看一下Info.plist里面的东西:

再看看项目工程的Info.plist:

两者可以进行一个对比,可以看出:

1、CFBundlePackageType不一样,项目是APPL,而Extension的是XPC!

2、比较明显的就是App Extension里面多了一个NSExtension的字典。

在Info.plist中,该文件必须包含NSExtension键和扩展点指定的键和值的字典。这里的ExtensionPointIdentifier是com.apple.share-services,因为我创建的是Share Extension。

这里注意,如果你的app extension的Info.plist里面包含了UIBackgroundModes key那么将无法通过AppStore的审核。

2.2.3:调试App Extension

调试App Extension很简单,你要做的就是选择(scheme)扩展,然后点击Run, 就会弹出一个弹框让你选择Host app,选择Host app之后便可以运行调试。比如你调试Share Extension,你可以选择照片,然后让照片当Host app,然后运行之后就会打开照片,选择分享就会看到你的app扩展,然后进行debug断点处理等。

2.3:Share Extension Demo

先看一下我自己做的分享Demo效果:
 

然后在containing app里面查看分享的图片:如上图的第三张图。先看一下这里默认创建的Share Extension的视图控制器:

class ShareViewController: SLComposeServiceViewController {

    override func isContentValid() -> Bool {
// Do validation of contentText and/or NSExtensionContext attachments here
return true
} override func didSelectPost() {
// This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments. // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
} override func configurationItems() -> [Any]! {
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
return []
} }

里面主要有三个方法:

isContentValid是用来判断内容是否可用的,这里可以做一些校验,比如我们分享的内容是否符合要分享的要求,如果返回false,那么在上图的Post按钮就无法点击了。因为一旦返回false,则说明分享内容不符合要求,也就无法Post了。

configuration是一个配置数组,它可以配置多个列表,例如微信分享的[发送给朋友,分享到朋友圈,收藏]:

didSelectPost是你点击发送之后处理的事件,比如微信的点击收藏,可以调用微信的api,然后进行收藏。默认的注释也说明了本方法的作用:

当用户选中post之后调用。是对内容或者NSExtensionContext附件的上传。我这里使用App Group的方式进行app Extension和containing app进行交互。先将内容存储到UserDefaults,然后再在containing app里面取出图片展示到containing app里面。

这里我把图片存储到了UserDefaults,然后在Containing app里面获取:

suite的name是app group的名称。具体可参见Github源码里的ShareExtension。

总结

App Extension的出现使App的使用更加方便,比如系统的天气widget,还有类似微信(QQ)的分享,完全可以实现不打开containing app而直接使用share extension分享。

在后续的时间里,将会不定期进行更新,给读者介绍其他的Extension,如有任何疑问,随时留言沟通。

参考资料

1、App Extension Programming Guide

2、深入App Extensions for iOS8

3、Information property List Key Reference

4、App Extension Programming Guide---Share

App Extensions篇之Share Extension的更多相关文章

  1. App Extensions篇之Sticker Pack Extension

    转载请标明原文链接:http://www.cnblogs.com/zhanggui/p/7151795.html 前言 上一篇文章对App Extension做了简单介绍以及对Share Extens ...

  2. WWDC2014之App Extensions学习笔记

    一.关于App Extensions extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制. extension的出现,为用户 ...

  3. WWDC2014 IOS8 APP Extensions

    本文转载至 http://blog.csdn.net/jinkaiouyang/article/details/35558623  感谢撰文作者的分享     WWDC14 最令人兴奋的除了新语言sw ...

  4. iOS - Share Extension

    1. 学 Share Extension 之前 先了解一下iOS的App Extension 2.1 创建Share Extension扩展Target ** 注:扩展不能单独创建,必须依赖于应用工程 ...

  5. iOS 8 Share Extension Safari URL Example(在iOS中分享url的样例)

    ios8 的Extension给我们提供了非常多奇妙的功能.以后分享内容再也不用进入app了,让我们的手机更安全,以下我们以在safari 浏览器中分享一个web url 来讲述Share Exten ...

  6. 【HELLO WAKA】WAKA iOS客户端 之一 APP分析篇

    由于后续篇幅比较大,所以调整了内容结构. 全系列 [HELLO WAKA]WAKA iOS客户端 之一 APP分析篇 [HELLO WAKA]WAKA iOS客户端 之二 架构设计与实现篇 [HELL ...

  7. Hybrid APP基础篇(二)->Native、Hybrid、React Native、Web App方案的分析比较

    说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid Ap ...

  8. Hybrid APP基础篇(三)->Hybrid APP之Native和H5页面交互原理

    本文已经不维护,新地址: http://www.cnblogs.com/dailc/p/8097598.html 说明 Hybrid模式原生和H5交互原理 目录 前言 参考来源 前置技术要求 楔子 A ...

  9. Hybrid APP基础篇(四)->JSBridge的原理

    说明 JSBridge实现原理 目录 前言 参考来源 前置技术要求 楔子 原理概述 简介 url scheme介绍 实现流程 实现思路 第一步:设计出一个Native与JS交互的全局桥对象 第二步:J ...

随机推荐

  1. 2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放

    首先我们从java.util.concurrent.locks包中的AbstraceQueuedSynchronizer说起,在下文中称为AQS. AQS是一个用于构建锁和同步器的框架.例如在并发包中 ...

  2. centos mysql5.7 二进制包安装

    此种方式安装非常简单 cd /usr/local 下载安装包wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17-linux- ...

  3. 第一篇:使用Spark探索经典数据集MovieLens

    前言 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息. 这个数据集经常用来做推荐系统,机器学习算法的测试数据集.尤其在推荐系统领域,很多著名论文都是基于这 ...

  4. 解决xshell连接不上Ubuntu

    起初,我虚拟上网是通过NAT上网的,xshell 可以正常连接Ubuntu . 后来有段时间,主机上网频繁断线,于是,我将网络适配器VM1,VM8禁用了. 还有一次,麻烦公司同事远程协助,虚拟机通过桥 ...

  5. 第 2 章 MySQL 架构组成

    麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...

  6. 腾讯AlloyTeam正式发布omi-cli脚手架 v1.0 - 创建网站无需任何配置

    omi-cli omi-cli omi-cli命令 omi框架 用户指南 文件目录 npm 脚本 npm start npm run dist 代码分割 兼容 IE8 插入 CSS 插入组件局部 CS ...

  7. 一天搞定HTML----标签语义化04

    根据页面里不同的内容,选择最适合它的标签,而不通篇只用一种标签 标签语义化作用: 代码演示 通过比较- - -H5布局和DIV+CSS 布局- - -体现标签语义化 注意: 标签语义化,不仅仅只是指使 ...

  8. ActionContext、ServletContext、pageContext的区别?

    ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request.session.ServletContext等与Action有关的对象的引用: Se ...

  9. textarea的中文输入判断与搜狗输入法的特殊行为

    虽然要讲解的知识点是通用的,但是还是要介绍下我的应用场景和测试环境. 0.1 应用场景和测试环境 我的应用是一块使用Html Canvas开发的黑板,在黑板上实现简单的文字编辑功能. 操作系统:win ...

  10. python大规模爬取京东

    python大规模爬取京东 主要工具 scrapy BeautifulSoup requests 分析步骤 打开京东首页,输入裤子将会看到页面跳转到了这里,这就是我们要分析的起点 我们可以看到这个页面 ...