首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS Extension介绍以及一些Extension开发经验浅谈

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

原创
作者头像
iminder
发布2018-07-19 11:07:10
1.2K0
发布2018-07-19 11:07:10
举报
文章被收录于专栏:iOSiOS

标签: 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
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通信

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

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间接通信
Extension和Containing App间接通信

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

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使用。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Extensions生命周期
  • Extensions的通信机制
    • 和host app 通信
    • 和Containing App通信
    • 和Containing App共享代码
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档