又一篇 iOS Extension 入门(2/3)— 与容器沟通

栏目: IOS · 发布时间: 6年前

内容简介:在上一篇文章里,我们了解到了 iOS Extension 的基础和怎么制作一个简单的分享扩展,然而,限于篇幅原因,这个分享操作止于用户点下 “Post” 的那一刻了。接下来,就让我们一起看看怎么把用户分享的数据给到载体应用,让这次分享溜得飞起。我们都知道 iOS 的应用是跑在一个属于自己的沙盒里面的,为了实现应用间的数据共享,苹果提供了一个叫 App Groups 的概念。只有当应用属于同一个 App Groups 的时候,才能访问到共享的数据存储区域。

在上一篇文章里,我们了解到了 iOS Extension 的基础和怎么制作一个简单的分享扩展,然而,限于篇幅原因,这个分享操作止于用户点下 “Post” 的那一刻了。

接下来,就让我们一起看看怎么把用户分享的数据给到载体应用,让这次分享溜得飞起。

App Groups

我们都知道 iOS 的应用是跑在一个属于自己的沙盒里面的,为了实现应用间的数据共享,苹果提供了一个叫 App Groups 的概念。只有当应用属于同一个 App Groups 的时候,才能访问到共享的数据存储区域。

我们可以在载体应用的项目配置 Capabilities -> App Groups 里创建一个应用分组:

又一篇 iOS Extension 入门(2/3)— 与容器沟通

然后在应用扩展的项目配置 Capabilities -> App Groups 里会出现我们刚刚新建的应用分组,直接钩上就可以了。

这样我们就等于分配了一个共享空间给这哥俩,为我们接下来的数据共享做好准备了。

共享空间

做完上面的准备之后,我们就可以通过三种方式去访问共享空间,它们分别是 UserDefaultsFileManagerCoreData

UserDefaults

UserDefaults 有一个带参数的初始化方法,通过这个方法我们可以访问到一个共享的用户配置空间。在上一篇文章里,我们成功把 Safari 分享出来的一个 URL 打印了出来,现在我们把它放到共享空间去,让载体应用也可以获取到这个链接:

...

attachment.loadItem(forTypeIdentifier: kUTTypeURL as String, options: nil) { (item, error) in
                        if error == nil {
                            let userDefaults = UserDefaults(suiteName: "group.com.davidleee.SharePlayground")
                            userDefaults?.set(item, forKey: "share-url")
							   print("url from userdefault: \(userDefaults?.value(forKey: "share-url"))")
                        }
                    }

...

通过传入之前设置好的应用分组 ID,我们告诉 UserDefault 接下来要访问一个特定的共享空间,接着就像平常那样使用它即可。

上面的打印输出的是一堆 data,以为 URL 在保存到 UserDefaults 的时候会被序列化,想看到原来的 URL 对象的话还要再反序列化一下才行。

FileManager

UserDefaults 类似, FileManager 也有一个特殊的获取方法,我们看看把刚刚的 URL 写到一个文本文件里应该是什么样子:

...

let groupPath = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.davidleee.SharePlayground")
                            if let url = item as? URL, let filePath = groupPath?.appendingPathComponent("url.txt")  {
                                try? url.absoluteString.write(to: filePath, atomically: true, encoding: .utf8)
                            }
                            
                            if let filePath = groupPath?.appendingPathComponent("url.txt") {
                                try? print("content of file: \(String(contentsOf: filePath, encoding: .utf8))")
                            }

...

CoreData

好吧,CoreData 的共享空间其实跟 FileManager 是同一个,只是从写文件变成写数据库,再把数据库的文件放到共享空间而已。这个就不贴代码了,CoreData 里的类名是真的长…

总结一下

感觉这篇文章跟应用扩展都没什么关系了…毕竟 App Goups 是 iOS 平台上一个比较通用的数据共享技术。

App Groups 的引入让 iOS 应用间数据共享成为可能,这不仅可以用在应用扩展和载体应用之间,还可以用在自家的多个独立应用之间,真可谓是沙盒墙上透过来的一道亮光。


以上所述就是小编给大家介绍的《又一篇 iOS Extension 入门(2/3)— 与容器沟通》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

产品心经

产品心经

闫荣 / 机械工业出版社 / 2014-9-30 / 59

产品经理如何才能迅速地、全方位地提升自己的能力,从而打造出让用户尖叫并疯狂爱上的产品?有没有捷径?从成功的、有经验的产品经理的实践真知和智慧中学习是一个很好的途径!本书就是一位拥有近10年产品经验的资深产品经理的实践真知和智慧的结晶,从产品经理核心素养、产品认知、战略与规划、精益开发、需求分析与管理、用户体验、精细运营7大方面,系统梳理了能全面、迅速提升产品经理能力,从而打造出让用户尖叫的产品的5......一起来看看 《产品心经》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具