iOS Extension介绍以及一些Extension开发经验浅谈

标签: Extension开发


苹果在iOS 8之后引入了一些新的特性,Extension就是其中之一,一开始提供的Extensions包含Today、Action、Share、Photo Editing等扩展,而在WWDC 2016又介绍并在iOS 10里引入了一些的新的Extensions比如Messages等。可见苹果在逐步变得开放。为开发者提供了更加广阔的施展舞台。既然iOS提供了这么丰富的Extensions,作为个人云存储的微云是否可以利用这些特性来做一些满足微云主功能的小特性呢,答案是肯定的,本文在做Action就是探索了Extensions的一些特点。本篇主要介绍Extensions的一些基本特点,和Container App共享数据,共享代码的方式等。并且会在其中介绍Extensions的一些坑。

Extensions生命周期

image_1b39n2roe1isu1eiq1plfsn41tbe13.png

这张图很好的表现了Extensions的生命周期,Extensions只能由用户选择后,由系统来呼起Extension,执行完相应的功能后,Extensions就会被系统干掉。这个生命周期过程很简单清晰,但是在做Action时却发现一个问题,就是用户快速多次点击Action的图标时,Action的界面能弹出来,但是会卡死。这里通过断点发现,系统创建了多个Action的进程!这导致了界面卡死,连消失按钮也没有用了,这个问题在Dropbox和微云的Action Extensions都出现了,应该是iOS系统的问题,期待后续苹果通过系统更新优化这里吧。

Extensions的通信机制

Extensions里的通信主要包含和host app的通信以及和containing app的通信。

和host app 通信

Extensions和Host app通信

Extensions和host app可以直接通信,host app可以直接传递内容给extensions,这里的传递的媒介就是Extension Context。

Extension Context

可以传递的内容包含多种,这个是在Extensions的Info.plist文件里指定的。

 __weak typeof (self)weakSelf = self;
    for (NSExtensionItem *item in self.extensionContext.inputItems) {
        for (NSItemProvider *itemProvider in item.attachments) {
            for (NSString* identifier in itemProvider.registeredTypeIdentifiers) {
                [itemProvider loadItemForTypeIdentifier:identifier options:nil completionHandler:^(id item, NSError *error) {
                    //get the item or url
                    }
                }];
            }
        }
    }

上述代码就可以得到你想要的image/video/text等你需要的内容。

和Containing App通信

Extension和Containing App间接通信

Extensions和Containing App之间的通信与数据共享就比较复杂了,简单来说有openURL以及共享数据的方式,openURL的方式对于大部分Extensions除了Today Extensions等少数几个来说是不可行的,否则你的Action/Share Extension直接呼起Containing App就不用做任何工作了。比较靠谱的方式也就是通过App Groups来对公共的沙箱来进行读写了。要注意Extensions是不能直接读写Containing app的数据的。

Extensions和Containing App直接的数据共享

上图就是典型的数据共享方式。

和Containing App共享代码

在做微云Action的时候发现这个才是在开发中通过实践才能掌握的一些经验,但是没找个合适的文章来介绍代码共享。可以总结为两种代码共享方式

  1. Embedded Framework 第一种Embedded Framework 是苹果为支持Extension和Containing App之间共享代码设计的一种Framework形式。这里也建议在新开发的库都已Framework形式对外提供,微云里就是将之前静态库都改成了Framwork形式,并且新的库都以Framework形式存在项目中。具体的Framework制作网上有很多文章,不再过多介绍。微云在这里提供Framework时并没有把去手动的合成一个Framework,而是保留了相应的Framework子工程库,在编译好子工程之后,将Framework拷贝到一个父目录指定的一个目录下提供给Containing App和Extension链接使用。这种方式方便对子工程更改以及调试。唯一的缺点是需要写一个Run Script来拷贝Framework。
  2. Source Code Share 第二种源码分享也是一种代码共享方式,这里要注意的是,你共享的源码文件里引用的所有其他源码文件也要是共享的,否则会有编译错误,所以这种方式会导致一些不可控的膨胀,不建议使用,实在需要共享的代码也尽量减少对其他源码的依赖,或者单独拷贝一份给Extension使用。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏工科狗和生物喵

Mac OS X 下非官方软件自启动处理

正文之前 说是处理,想必也没几个人喜欢自启动的软件,我是一个控制欲比较强的人,开机自启搜狗输入法这个我能接受,但是像印象笔记啊,向日葵圆孔Client客户端这些...

67760
来自专栏张善友的专栏

腾讯社区开放平台.NET SDK在Mono下运行

腾讯社区开放平台.NET SDK在CentOS下运行发生了如下错误: QzoneException:  QConnectSDK.Exceptions.Qzon...

21680
来自专栏bboysoul

安装python时碰到的尴尬的事情(使用pyenv离线安装python)

前几天迫不得已重装了系统,所以要重新安装一下python,我用的python版本管理工具是pyenv,大家都得知道一点的是大天朝的电信出口带宽等于断网,所以我用...

21720
来自专栏小轻论坛

再推荐大家一个很耐撕的系统优化工具

Avast Cleanup Premium 是Avast公司开发的一款强大的电脑优化清理软件,可以进行维护、加速、释放磁盘空间、修复电脑问题等四大模块,还可以删...

31850
来自专栏逸鹏说道

C#线程篇---Windows调度线程准则(3)

Windows本身就是一个抢占式操作系统,它的实现,必定有某种算法在里面,比如什么时候调度哪些线程,需要花费多长时间等问题。 我们时时在用Windows,作为程...

35540
来自专栏Albert陈凯

常见编程语言对REPL支持情况小结

最近跟一个朋友聊起编程语言的一些特性,他有个言论让我略有所思:“不能REPL的都是渣”。当然这个观点有点偏激,但我们可以探究一下,我们常用的编程语言里面,哪些支...

35940
来自专栏小白课代表

Autodesk 3DS MAX 2019安装教程

3D Studio Max,常简称为3d Max或3dsMAX,是Discreet公司开发的(后被Autodesk公司合并)基于PC系统的三维动画渲染和制作软件...

18220
来自专栏安恒信息

0day 预警 | Microsoft恶意软件防护引擎存在远程执行代码漏洞(CVE-2017-0290)

5月6日,谷歌的安全团队Project Zero在社交媒体上公布了Windows恶意软件防护引擎中的重大远程命令执行漏洞;8日,微软官方公布了此漏洞;9日,Pr...

32040
来自专栏张善友的专栏

32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0

CentOS是一个基于RHEL的Linux发行版,其目的是为了提供一套免费与自由的企业等级Linux发行版。CentOS的名称来自于「Community ENT...

25650
来自专栏葡萄城控件技术团队

如何搭建基于C#和 Appium 的 Android自动测试环境

如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使用的人多,资料丰富,支持语言多 Jave,Python,C#,Ruby,PHP,碰见问题也容...

12020

扫码关注云+社区

领取腾讯云代金券