iOS8扩展插件开发配置
分类:计算机编程

Share Extension 简介

前两篇小说介绍了Application Extension运维原理、Today Extension,本篇来介绍一下 Share Extension 创制和动用。分享扩大给用提供二个有利的不二秘诀来分享内容,比方在有个别带有分享按键的应用中,客商能够采纳贰个享用扩张,来把要想享受的原委照旧商酌发布到自个儿的社交账号。

可以在iOS、macOS上创办分享扩张,在创制此前要注意:

  • 确定保障顾客在行令你的享用扩充时,方便、快速
  • 有限支撑客商能够预览、编辑、配置要分享的从头到尾的经过
  • 在享用在此之前确认内容

转发请申明出处:

转发请申明出处:

一.iOS8扩张插件概述

WWDC14除了宣布了OS X v10.10和switf外,iOS8.0也开端变得越发开放了。谈起开放,当然要数应用扩大(App Extension)了。看名称就能够想到其意义,应用扩大允许开采者扩充应用的自定义功用和剧情,能够让客户在采纳任何应用程序时利用该项效能,进而达成各样应用程序间的效果与利益和能源分享。可以将扩展明白为贰个轻量级(nimble and lightweight)的分娩。

以下为广大的三类插件:

Target Type

Extension point identifier

Scenarios

Today Extension

com.apple.widget-extension

系统通知栏下拉显示

Share Extension

com.apple.share-services

Host App(照片、Safari、邮件、语音等)分享菜单第一行

Action Extension(UI)

com.apple.ui-services

Host App(照片、Safari、邮件、语音等)分享菜单第二行

下图为iPhone/iOS8中的【照片】分享:

图片 1

举个例子【微信】最多帮助分享9张(NSExtensionActivationSupportsImageWithMaxCount=9)照片给密友或到生活圈。

创建 Share Extension

上面就来在iOS上创办贰个分享扩张,就随之上篇的Today项目里面成立。潜心本例子使用的是 Xcode9,iOS 11。新建 target

图片 2创建 Share Extension

创建之后Xcode暗许的模板就可直接运维,在运维的时候能够采用运营尊敬选取Containing App,想要看到你的分享的扩充,需求另开采叁个满含共享开关的采用当做你的扩大的宿主应用Host App,在Host App中开展分享页面技艺看到,若是看不到的话,点击More越来越多开关,在里边张开就能够观察。

最佳直接选用享受增添运营,方便大家调试,在增选享受扩充运行时,弹出个框选择贰个iOS App来作为你的恢弘的Host App,如下图所示:

图片 3

事例选拔打开系统的相册,运转打开相册,点击分享按键,看到创制的扩大,点击就能够弹出系统暗中同意的编写视图。

图片 4图片 5

纵然系统弹出的暗许编辑视图不能够满足你的必要,也足以不用系统暗中同意的分享弹出框,完全自个儿完结三个编辑视图。

1.前言

那边境海关键是对App Extension的局地介绍以及详细给大家介绍一下Share Extension,早先时期会增添任何的Extension介绍。

1.前言

此地主如若对App Extension的部分介绍以及详细给大家介绍一下Share Extension,前期会加多任何的Extension介绍。

二.插件职业体制

1.插件只好与Host App通过上下文直接通讯

图片 6

2.插件可经过分享财富区与Containing App直接通讯

图片 7

3.Host App-Extension-Containing App工作流程

  • Host App透过点击系统一分配享菜单中的插件Logo调起扩大程序——Share/ActionExtension (*.appex)。
  • iOS系统(Host App)通过扩大上下文(NSExtensionContext)向Share/ActionExtension传递欲共享的多少。
  • Share/Action Extension领取数据并种类化到以AppGroup ID标志的分享能源区NSUserDefaults/AppGroup Container(containerU翼虎LForSecurityApplicationGroupIdentifier)中。
  • Share/Action Extension通过URL Scheme呼起ContainingApp,並且插件通过上下文向iOS系统(HostApp)发出request completion通告,以便回到到Host App(iOS系统会dismiss插件UIViewController)。
  • Containing App通过App Group ID从NSUserDefaults/containerUENVISIONL中读取分享过来的多少,并对分享数据进行延续管理。

 

有鉴于此,扩张插件将Host App与Containing App勾搭起来,而App Group Container则架起了数码交互的鹊桥。

此处必要小心的是,在iOS 8.0中,只有Today Extension才支撑直接调用NSExtensionContextopenURL:completionHandler:开采U大切诺基L链接;Share/Action Extension要想达成UKugaL Scheme,只可以创建二个Sink UIWebVew对URL进行loadRequest贯彻曲线救国(所谓“Sink”是指隐而不显,举例frame=CGRectZero)。

4.插件的UI形态

插件在UI上以UIViewController情势存在,被parentViewController(Host App)以模态窗口情势弹出(present as modal viewController)。

插件工程在Info.plist的NSExtension中通过NSExtensionMainStoryboard钦定UI视图入口。当然,假设不想采纳storyboard,也足以选用NSExtensionPrincipalClass点名自定义UIViewController子类名(也足以打包到UINavigationController)。

注意:

 

  • 新建Extension Target后(Deployment Target≥8.0),需在Build Settings|Architectures|Valid Architectures中增加arm64
  • 开班安装Containing App时,扩张插件并未有使能,供给到【更加多】中开辟按钮。

宣称 Share Extension 援助的数据类型

应用Xcode创立 Share Extension 后,项目文件夹里暗中同意生成的文本有 ShareViewController、Info.plist、storyboard。Info.plist里面饱含 Share Extension 的局地配置文件,值得注意的是 NSExtension 扩充描述字段,用来安装扩充的片段天性:

<key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <string>TRUEPREDICATE</string> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.share-services</string> </dict>

依靠你的享用扩张的内需去丰裕对应键。NSExtensionAttributes 是用来描述增加的品质字段,里面包括了 NSExtensionActivationRule ,这么些用来决定 Share Extension 或许 Action Extension 所能援助的享用的原委,暗中同意的值是 TRUEPREDICATE 共享的原委都满足增添需求,该享受增加会间接在享用列表显示供顾客选取。如若对享受的原委有着限制,举个例子微信、腾讯网,最多能分享九张图,要是您的挑选了多于九张图,则在共享列里就不会来得微信、今日头条的分享。想要增加限制,需求修改 NSExtensionActivationRule 对应的值为 dictionary,里面所能满含的键有AppExtensionKeys:

图片 8

富含了支撑的最大、最小的开始和结果个数、文件个数、图片个数、摄像个数、链接个数等。举例下边包车型客车属性配置最大帮忙10张图片、1个录制、1个网页:

<key>NSExtensionAttributes</key> <dict> <key>NSExtensionActivationRule</key> <dict> <key>NSExtensionActivationSupportsImageWithMaxCount</key> <integer>10</integer> <key>NSExtensionActivationSupportsMovieWithMaxCount</key> <integer>1</integer> <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> <integer>1</integer> </dict> </dict>

假若不支持某一定的数据格式可设置值为0,也许从dictionary中移除对应的值。

2.开始

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

2.开始

重中之重对App Extension和Share Extension进行介绍。请继续往下看:

三.插件的局限性

以下文字节选自《App Extension Programming Guide》,首要列举了插件的局限性,以知其可为不可为。


1.Design a Streamlined UI

  • An extension`s UI should be simple, restrained, and focused on facilitating a single task.
  • To improve performance and the user`s experience, avoid including extraneous UI that doesn`t support your extension`s main task.

2.Optimize Efficiency and Performance

(1)App extensions should feel nimble and lightweight to users.

  • Design your app extension to launch quickly, aiming for well  style="text-decoration: underline">under one second.
  • An extension that launches too slowly is terminated by the system.

 (2)Memory limits for running app extensions are significantly lower than the memory limits imposed on a foreground app.

  • On both platforms, the system may aggressively terminate extensions because users want to return to their main goal in the host app.
  • Some extensions may have lower memory limits than others.

 (3)Your app extension doesn`t own the main run loop, so it`s crucial that you follow the established rules for good behavior in main runloops.

  • For example, if your extension blocks the main runloop, it can create a bad user experience in another extension or app.

 (4)Keep in mind that theGPU is a shared resource in the system.

  • App extensions do not get top priority for shared resources; for example, a Today widget that runs a graphics-intensive game might give users a bad experience. The system is likely to terminate such an extension because of memory pressure. 
  • Functionality that makes heavy use of system resources is appropriate for an app, not an app extension.

有鉴于此,iOS系统对插件供给精简至上:UI运行要快、内部存款和储蓄器消耗要少、runloop推行耗费时间要短。

iOS系统对插件的范围决定了开销的插件必需轻量,发点脸谱/微博分享、小图片文件分享、ULacrosseL跳转还能够的;奢望足够炫目的UI或许用来传大文件等大动作是不适合的。

理当如此,借使希望扩充(即便脱离)施行短时间任务(举例上传/下载),可以应用NSURLSession来创制三个上传/下载session,并开端化一个后台上传/下载职务。

注意:

Apple也限制了扩张在API使用方面包车型地铁权位,在扩展中禁止使用的API原型表明被标上了NS_EXTENSION_UNAVAILABLE宏。例如:

(UIApplication*)sharedApplication NS_EXTENSION_UNAVAILABLE_IOS;

对sharedApplication的界定实际上正是不让插件直接获取访谈宿主应用(Host App的UIApplication)对象。

处理 Share Extension 的数据

默许创制的ShareViewController 承接自SLComposeServiceViewController 。在ShareViewController中有个 didSelectPost 方法:

//用户点击发布post按钮后,调用此方法。//默认状态会在该方法里面实现extensionContext 的 -completeRequestReturningItems:completionHandler:方法//子类要覆盖此方法,从而能够根据上下文内容,来执行post操作// 子类可以用super调用此方法来完成默认的行为; 如果一个子类不调用super,那么它必须手动调用extensionContext的completeRequestReturningItems:方法。- didSelectPost { //执行post 操作 //获取分享的内容,发送请求 //NSExtensionItem *inputItem = self.extensionContext.inputItems.firstObject; [self.extensionContext completeRequestReturningItems:@[] completionHandler:nil]; //或者直接调用 [super didSelectPost] 默认状态下完成操作}

NSExtensionContext 类型的属性,是宿主应用 调起扩大所对应的上下文,里面包车型的士值包蕴了想要分享的图形、文字、网页等内容新闻。

图片 9NSExtensionContext

  • 属性 inputItems : 该数组存款和储蓄着容器应用传播给NSExtensionContext的NSExtensionItem数组。其中每一种NSExtensionItem标志了一种类型的多寡。
  • 艺术 completeRequestReturningItems: 文告宿主应用的扩张已做到透露伏乞。调用此方法后,增加视图会停业,当中的items正是回来宿主应用中的数据项。
  • 形式 cancelRequestWithError: 通告宿主应用的扩大已吊销乞请。其中error为错误的陈诉音信。

NSExtensionItem类的构造如下:

图片 10NSExtensionItem

NSExtensionItem中的attachments属性,是三个附件数组,数组里的是NSItemProvider类型,当中富含了图片、录像、链接等剧情。要想博得 NSItemProvider 中的内容会动用到其类中的贰个艺术 loadItemForTypeIdentifier:options:completionHandler 加载typeIdentifier钦命的财富,加载成功后会触发completionHandler。

因此 NSExtensionContext 上下文里的数据结构如下:

图片 11NSExtensionContext.png

从 NSItemProvider 中取得分享内容的主意,如下(获取分享的网页链接的数目):

 [self.extensionContext.inputItems enumerateObjectsUsingBlock:^(NSExtensionItem * _Nonnull extItem, NSUInteger idx, BOOL * _Nonnull stop) { [extItem.attachments enumerateObjectsUsingBlock:^(NSItemProvider * _Nonnull itemProvider, NSUInteger idx, BOOL * _Nonnull stop) { if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"]) { [itemProvider loadItemForTypeIdentifier:@"public.url" options:nil completionHandler:^(NSURL * _Nullable item, NSError * _Null_unspecified error) { //NSLog(@"url === %@", item); } }]; }];

就这么一步步赢获得要享用的故事情节,获取到内容后发送内容给服务器,Share Extension 能够经过与容器应用Containing App 分享数据,在Containing App中显得从 Host App 分享过来的数额。(Extension和Containing App间分享数据,在上一篇小说Today Extension有介绍,同样的秘诀能够去查看,这里就不在赘述了)

粗略的写了个小例子,效果如下:

图片 12

Demo地址:

App Extension Programming Guide - Today

2.1: App Extension的介绍

 官方给的说法是:App Extension能够让您扩大你的应用程式的自定义功效和内容,使客商能够在与其余应用可能系统开展互动的时候去接纳它。翻译的不肯定规范,那样说大概会好通晓:大家平时阅览的Widget、微信和QQ的share等等,都以App Extension,下图是一些例证:

图片 13图片 14图片 15

实质上就是咱们平常看到的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: App Extension的介绍

 官方给的说教是:App Extension能够让您扩展你的应用软件的自定义成效和内容,使客户能够在与别的应用可能系统开展交互的时候去选取它。翻译的不自然标准,那样说大概会好明白:我们平日看到的Widget、微信和QQ的share等等,都以App Extension,下图是有个别例子:

图片 16图片 17图片 18

其实就是大家平时见到的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来展现到您的公告大旨。扩张也并非乱用,扩张的一流客商体验一贯都以意在顾客操作越来越精简、更连忙,何况注意于单个职分。

 

四.Share/Action扩大插件帮衬的媒体类型配置

Info.plist中的NSExtension|NSExtensionAttributes|NSExtensionActivationRule Dictionary能够安插插件帮助的媒体类型及数码:

 

iOS扩展插件支持媒体类型配置键

描述

配置

说明

NSExtensionActivationSupportsAttachmentsWithMaxCount

附件最多限制

20

附件包括下面的File、Image和Movie三大类,单一、混选总量不超过20

NSExtensionActivationSupportsAttachmentsWithMinCount

附件最少限制

上面非零时,default=1

默认至少选择1个附件,【分享】中才显示扩展插件图标

    NSExtensionActivationSupportsFileWithMaxCount

文件最多限制

20

文件泛指除Image/Movie之外的附件,例如【邮件】附件、【语音备忘录】等。

单一、混选均不超过20。

    NSExtensionActivationSupportsImageWithMaxCount

图片最多限制

20

单一、混选均不超过20

    NSExtensionActivationSupportsMovieWithMaxCount

视频最多限制

20

单一、混选均不超过20

NSExtensionActivationSupportsText

文本类型

default=0

默认不支持文本分享,例如【备忘录】

NSExtensionActivationSupportsWebURLWithMaxCount

Web链接最多限制

default=0

默认不支持分享超链接,例如【Safari】

NSExtensionActivationSupportsWebPageWithMaxCount

Web页面最多限制

default=0

默认不支持Web页面分享,例如【Safari】

 

 

宿主应用(Host App)提供一个上下文(NSExtensionContext)向扩充(appex)传递数据,富含了待管理的数额(inputItems)。其传递的多少是一组NSExtensionItem对象,在那之中要享受的图形、摄像、UEnclaveL等附件就保存在NSExtensionItem的attachments数组中。

关于UTIs,参考UniformType Identifiers Reference | System-Declared Uniform Type Identifiers。

媒体类型

文件UTI

图片(public.image)

kUTTypeImage

kUTTypeJPEG

kUTTypePNG

kUTTypeGIF

kUTTypeTIFF

kUTTypeBMP

kUTTypeICO

视频(public.movie)

kUTTypeMovie

    kUTTypeQuickTimeMovie

    kUTTypeMPEG

    kUTTypeMPEG4

    kUTTypeAVIMovie

    @"public.3gpp"

    @"com.real.realmedia"

    @"com.microsoft.windows-media-wmv"

@"com.microsoft.advanced-systems-format"

音频(public.audio)

kUTTypeAudio

kUTTypeMP3

kUTTypeMPEG4Audio

kUTTypeWaveformAudio

@"com.microsoft.windows-media-wma"

文档

kUTTypePDF

@"com.microsoft.word.doc"

@"com.microsoft.excel.xls"

kUTTypePresentation

    @"com.microsoft.powerpoint.ppt"

    @"com.apple.keynote.key"

压缩包

kUTTypeZipArchive

kUTTypeGNUZipArchive

kUTTypeBzip2Archive

@"public.tar-archive"

@"org.gnu.gnu-zip-tar-archive"

五.插件与Containing App的App Group证书配置

Containing App及其Extension是因而以App Group ID标志的分享能源区—App Group Container来兑现多中国少年共产党享的。

Containing App及其Extension的App ID必须是Explicit,且Extension App ID必须以Containing App ID为Prefix/Seed,况且安顿到同一App Group下。

App ID配置到Info.plist的BundleIdentifier中;App Group在target的【Xcode Target|Capabilities】中启用,配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】中的*.entitlements文件的com.apple.security.application-groups

键中。

声明和Provisioning Profile的提请以及Code Signing配置流程同从前常见的App,详细情形请参照他事他说加以考察《iOS开辟证书要点详解》。

2.1.1: Extension的种类

咱俩得以在Xcode的File--->New--->Target里面来看分歧平台的Extension,包含iOS、watchOS、tvOS、macOS等等。这里关键介绍iOS,重要不外乎以下两种Extensions:

1.Action Extension:动作扩大,在另二个应用程序的左右文中操作依然查看内容

2.奥迪o Unit Extension:音频单元扩充

3.Broadcast UI Extension:广播UI 扩展

4.布罗兹cast 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 ServiceExtension:通告服务增加

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.1: Extension的种类

大家得以在Xcode的File--->New--->Target里面来看差别平台的Extension,包含iOS、watchOS、tvOS、macOS等等。这里最主要介绍iOS,重要不外乎以下三种Extensions:

1.Action Extension:动作扩张,在另多个应用程序的内外文中操作依旧查看内容

2.奥迪(Audi)o 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 瑟维斯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。

六.Containing App的Build Phases配置(embed app extensions)

Containing App 的【Xcode target|BuildPhases|Target Dependencies】中得以拉长或移除插件target。

Containing App 的【Xcode target|BuildPhases|Embed App Extensions】下Destination为Plugins中得以加上或移除插件product(*.appex)。

注意:暗中同意了勾选“Copy only when installing”,表示从AppStore安装(包含进步覆盖)时才拷贝插件。Xcode连接真机调节和测量试验时,需取消该改项,不然系统【分享】菜单中不会出现插件

2.1.2: App Extensions的生命周期

先上海体育地方,算计您早就见到了累累次那张图,恭喜你这一次又看到了,因为那些是苹果官方提供的图片。

 图片 19

 

1.客户挑选要选取的App extension

2.系统运营App Extension

3.App Extension 代码运行

4.运作完事后系统kill掉App Extension

那正是App Extension的生命周期,举个例证:

三个Share Extension,在图Curry面你挑选了一张图片,然后点击分享,接纳你的Share Extension(第一步),此时系统会运营你的Share Extension(第二步)。然后您将挑选的图样分享到内定的程序(比如微信的发送给朋友)(第三步)。接下来分享页面关闭,系统kill掉了Share Extension。

2.1.2: App Extensions的生命周期

先上海教室,推断您早已看到了十分多次那张图,恭喜你本次又来看了,因为这一个是苹果官方提供的图片。

 图片 20

 

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沟通):

图片 21

 

 

 

其一显示的正是正值运营的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沟通:

图片 22

举个例子说Today Widget,能够直接报告系统展开他的Containing app,只须求调用NSExtensionContext的openURubiconL:CompletionHandler:方法就能够。

2.1.3: App Extension的通讯格局

App Extension重要的通讯是和他的host app(举个例子微信的Share Extension和微信),来自host app的乞求和extension的response。下图你应该也很熟识(app 扩大直接和host app沟通):

图片 23

 

 

 

其一显示的正是正在运作的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沟通:

图片 24

举例Today Widget,能够一贯告诉系统展开他的Containing app,只要求调用NSExtensionContext的openU宝马7系L:CompletionHandler:方法就能够。

2.1.4: 在App Extension中不可能做的作业

叁个app extension不能够有以下情况:

1.探望sharedApplication对象。因而无法使用别的该目的的防御

2.运用任何标记NS_EXTENSION_UNAVAILABLE宏的API,可能类似的宏,大概不可用framework里面的API,举个例子HealthKitframework不能够用来app extensions

3.iOS配备访谈相机或许Mike风(iMessage app能够访问那一个能源,只要在Info.plist里面实行计划使用描述就可以)

4.周转二个长日子的后台职责(依据分裂平台而异)

5.利用AirDrop接收数据

2.1.4: 在App Extension中不得以做的专门的学问

多个app extension无法有以下境况:

1.会见sharedApplication对象。因而不能够采纳任何该指标的防范

2.施用另外标志NS_EXTENSION_UNAVAILABLE宏的API,也许类似的宏,恐怕不可用framework里面的API,举例HealthKitframework无法用于app extensions

3.iOS设施访谈相机只怕迈克风(iMessage app能够访问那个能源,只要在Info.plist里面举行布署利用描述就可以)

4.运作二个长日子的后台职责(依据分裂平台而异)

5.利用AirDrop接收数据

 2.2: Share Extension的简练利用

那边大家以Share Extension为例举办介绍。

 2.2: Share Extension的简便利用

那边大家以Share Extension为例进行介绍。

2.2.1: 选取正确的Extension Point初叶支付 

当您创制app extension的时候,可以平素运用Xcode自带的沙盘创建你须求的Extension。点击File--->New--->Target:

图片 25

从此间接选举拔切合您必要的Extension,当您成立落成后,你的花色工程目录就能够多一个文书夹:

图片 26

能够发掘多了贰个.swift、.storyboard和叁个Info.plist。接下来您也会在Scheme里发掘多少个Extension,并且多了三个以.appex为后缀的Bundle

图片 27

此处需求留神:

一个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.1: 选取准确的Extension Point起首支付 

当您创立app extension的时候,能够直接行使Xcode自带的沙盘创立你须要的Extension。点击File--->New--->Target:

图片 28

从这里选择符合您供给的Extension,当您成立落成后,你的连串工程目录就能够多二个文本夹:

图片 29

能够开掘多了一个.swift、.storyboard和三个Info.plist。接下来您也会在Scheme里发掘一个Extension,並且多了贰个以.appex为后缀的Bundle

图片 30

此处需求潜心:

三个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里面包车型客车东西:

图片 31

再看看项目工程的Info.plist:
图片 32

双面能够拓宽三个对照,能够见见:

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.2: 来探视暗中认可的App Extension模板

从上面包车型地铁类型工程目录看,每一个extension都带有了三个plist文件、二个视图调整器类和三个暗中同意的user interface,这几个都是被extension point定义的。大家先来看一下Info.plist里面包车型地铁东西:

图片 33

再看看项目工程的Info.plist:
图片 34

双面能够拓宽四个相比较,能够看到:

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.2.3:调试App Extension 

调节和测量试验App Extension很简短,你要做的就是选拔(scheme)扩充,然后点击Run, 就能够弹出一个弹框令你挑选Host app,选用Host app之后便足以运作调解。举个例子您调节和测验Share Extension,你能够挑选照片,然后让照片当Host app,然后运维之后就能够展开照片,采纳享受就能够看到你的app扩大,然后开展debug断点管理等。

2.3:Share Extension Demo

先看一下我自身做的享用德姆o效果:
图片 35 图片 36图片 37

接下来在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是三个陈设数组,它能够配备多少个列表,比如微信分享的[发送给朋友,分享到对象圈,收藏]:

 图片 38

 didSelectPost是您点击发送之后管理的平地风波,比方微信的点击收藏,能够调用微信的api,然后开展收藏。暗中认可的讲授也表达了本办法的成效:

当客商选中post之后调用。是对剧情还是NSExtensionContext附属类小部件的上传。小编这里运用App Group的点子张开app Extension和containing app实行互动。先将内容存款和储蓄到UserDefaults,然后再在containing app里面抽出图片展示到containing app里面。

图片 39

那边本身把图纸存款和储蓄到了UserDefaults,然后在Containing app里面得到:

图片 40

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

2.3:Share Extension Demo

先看一下自个儿本人做的分享德姆o效果:
图片 41 图片 42图片 43

然后在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是二个配备数组,它能够配备四个列表,例如微信分享的[发送给朋友,分享到交际圈,收藏]:

 图片 44

 didSelectPost是您点击发送之后管理的轩然大波,比方微信的点击收藏,能够调用微信的api,然后开展收藏。暗中认可的解说也作证了本办法的效率:

当顾客选中post之后调用。是对剧情依然NSExtensionContext附件的上传。笔者这里运用App Group的格局展开app Extension和containing app进行互相。先将内容存款和储蓄到UserDefaults,然后再在containing app里面抽出图片呈现到containing app里面。

图片 45

此间本人把图片存款和储蓄到了UserDefaults,然后在Containing app里面获取:

图片 46

 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 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

本文由pc28.am发布于计算机编程,转载请注明出处:iOS8扩展插件开发配置

上一篇:Application Extension(二):Today Extension 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • iOS8扩展插件开发配置
    iOS8扩展插件开发配置
    Share Extension 简介 前两篇小说介绍了Application Extension运维原理、TodayExtension,本篇来介绍一下 Share Extension创制和动用。分享扩大给用提供二个有利的不二秘
  • Application Extension(二):Today Extension
    Application Extension(二):Today Extension
    简介 在公告中央的Today的视图中显得的 extension 叫做 widget ,widget能够一本万利客户神速的获取想要的音信,不用再经过复杂的步骤伸开app工夫找到自个儿想
  • Application Extension(一):介绍
    Application Extension(一):介绍
    本篇文章是对 iOS Application Extension的简单介绍。介绍的开始和结果富含:对Application Extension的品类、运营原理、申明周期、之间的通讯等。 转发请注脚出处
  • 内购模块,中沙盒账号使用注意事项
    内购模块,中沙盒账号使用注意事项
    重新提醒登入账号.png https://wilddylan.github.io/2016/09/23/IAP/ 文档: 京东开拓 1、前言 在iOS12前,借使对沙盒账号测量试验充钱不熟知的同学,大概会境遇过如此
  • 自家是怎样一步一步完结网页离线缓存的,缓存
    自家是怎样一步一步完结网页离线缓存的,缓存
    在利用iOS的webview的时候开采这么八个难题,加载二个网页进来,webview会负担缓存页面里的css,js和图片那么些财富。可是这一个缓存不受开拓者调控,缓存