标签: 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的生命周期,Extensions只能由用户选择后,由系统来呼起Extension,执行完相应的功能后,Extensions就会被系统干掉。这个生命周期过程很简单清晰,但是在做Action时却发现一个问题,就是用户快速多次点击Action的图标时,Action的界面能弹出来,但是会卡死。这里通过断点发现,系统创建了多个Action的进程!这导致了界面卡死,连消失按钮也没有用了,这个问题在Dropbox和微云的Action Extensions都出现了,应该是iOS系统的问题,期待后续苹果通过系统更新优化这里吧。
Extensions里的通信主要包含和host app的通信以及和containing app的通信。
Extensions和host app可以直接通信,host app可以直接传递内容给extensions,这里的传递的媒介就是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等你需要的内容。
Extensions和Containing App之间的通信与数据共享就比较复杂了,简单来说有openURL以及共享数据的方式,openURL的方式对于大部分Extensions除了Today Extensions等少数几个来说是不可行的,否则你的Action/Share Extension直接呼起Containing App就不用做任何工作了。比较靠谱的方式也就是通过App Groups来对公共的沙箱来进行读写了。要注意Extensions是不能直接读写Containing app的数据的。
上图就是典型的数据共享方式。
在做微云Action的时候发现这个才是在开发中通过实践才能掌握的一些经验,但是没找个合适的文章来介绍代码共享。可以总结为两种代码共享方式
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。