App Extensions篇之Share Extension

转载请注明出处: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 64-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 64-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

时间: 2024-12-15 01:38:32

App Extensions篇之Share Extension的相关文章

App Extensions篇之Sticker Pack Extension

转载请标明原文链接:http://www.cnblogs.com/zhanggui/p/7151795.html 前言 上一篇文章对App Extension做了简单介绍以及对Share Extension的使用做了简单说明,本篇文章主要是对Sticker Pack Extension进行介绍. 开始 接下来是对Sticker Pack Extension的一些介绍. Sticker Pack Extension是什么? 从字面看就是贴纸包扩展,更直观一点看下图: iMessage里面这些都是i

WWDC2014 IOS8 APP Extensions

本文转载至 http://blog.csdn.net/jinkaiouyang/article/details/35558623  感谢撰文作者的分享 WWDC14 最令人兴奋的除了新语言switf外,无疑就是整个APPLE平台的开放了.说到开放,当然就是属于Extension了.Extension实现了各个应用程序间功能和资源的共享. 下面我们来看看Extension具体有哪些 Today -- 在 iOS 系统的“通知中心”里,支持第三方应用集成的“小工具.小部件”,比如 eBay 提供的价

WWDC2014之App Extensions学习笔记

一.关于App Extensions extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制. extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today的widgets中查看应用展示的简略信息,而不用再进到我们的应用中,这将是一种全新的用户体验:但是,extension的出现可能会减少用户启动应用的次数,同时还会增大开发者的工作量. 几个关键词 extension poin

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

ios8 的Extension给我们提供了很多神奇的功能,以后分享内容再也不用进入app了,让我们的手机更安全,下面我们以在safari 浏览器中分享一个web url 来讲述Share Extension的工作原理 1 新建一个Share Extension target 参考http://blog.csdn.net/wjsxiaoweige/article/details/39524291phone Extension的建立 2  配置info.plist  在NSExtensionActi

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

说明 JSBridge实现原理 目录 前言 参考来源 前置技术要求 楔子 原理概述 简介 url scheme介绍 实现流程 实现思路 第一步:设计出一个Native与JS交互的全局桥对象 第二步:JS如何调用Native 第三步:Native如何得知api被调用 第四步:分析url-参数和回调的格式 第五步:Native如何调用JS 第六步:H5中api方法的注册以及格式 进一步完善JSBridge方案 思路 实现 注意 完整的JSBridge 完整调用流程图 另外实现:不采用url sche

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

说明 Native.Hybrid.React.Web App方案的分析比较 目录 前言 参考来源 前置技术要求 楔子 几种APP开发模式 概述 Native App Web App Hybrid App React Native App 分析 各大开发模式直观对比 如何选择开发模式 另类的app方案 微网页 微信小程序 其它 前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 对当前主流hybrid app.web app与native app工具的初步比较与分析 H5.React Nati

iOS App Extensions

一.扩展概述 扩展(Extension)是iOS 8中引入的一个非常重要的新特性.扩展让app之间的数据交互成为可能.用户可以在app中使用其他应用提供的功能,而无需离开当前的应用. 在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据. 而在引入扩展之后,其他app可以与扩展进行数据交换.基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,它拥有自己的bundle, bundle后缀名是.appex.扩展bundle必须包含在一个普通应用的bundle

如何快速的开发一个完整的iOS直播app(原理篇)

前言 大半年没写博客了,但我一直关注着互联网的动向,最近会研究很多东西,并分享,今年移动直播行业的兴起,诞生了一大批网红,甚至明星也开始直播了,因此不得不跟上时代的步伐,由于第一次接触的原因,因此花了很多时间了解直播,整理了直播的原理,当前只是原理篇,后续会持续发布实战篇,教你从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播. 一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频

安卓app设计规范整理和Android APP设计篇(转)

随着安卓智能手机不停的更新换代.安卓手机系统越来越完美,屏幕尺寸也越来越大啦!比如最近小米的miui 6的发布和魅族手机系统的更新等等. 以小米MIUI6的安卓手机来说,MIUI6进行了全新设计,坚持“内容才是本质”的设计哲学,重新提炼内容,简化图标设计. 所以,我们在进行安卓APP设计时,需要好好调整之前的设计规范和设计细节.根据目前流行的安卓手机的系统体验来完成我们的安卓APP设计规范.应该说这是整理出最全面的安卓app设计规范. 25学堂站在不断更新和完善安卓app设计规范为宗旨!利用周末