在 App 扩展和主 App 间共享数据

 

tags: iOS 8,Swift,App Groups

随着 iOS 8 的发布,苹果为广大开发者很多新的 API,其中最突出显著的就非 App Extension 莫属了。这为开发者们又带来了很多机会。

而我们在开发 App Extension 的时候,基本大多数人都会遇到这样一个问题。就是由于 App Store 的规则是 App Extension 不能独立的发布,而是要跟随一个宿主应用一起发布。

比如奇妙清单:

我们看到,通过 App 扩展,奇妙清单将主 App 的任务数据显示到了通知中心上面。而这个通知中心插件的数据是来自它的主应用的。

要达到这个效果,就需要这两个 App 之间的数据进行共享。注意,是两个独立的应用哦。App 扩展虽然是以插件形式附属在主 App 中的,但它也作为一个独立的 App。

在两个独立的应用间共享存储数据有什么方法呢?这就需要 App Groups 的概念。

从名字就可以看出来啦,App Groups 就是应用分组,将不同的应用分到一个 App Groups 中,即可在这些应用之间共享数据。

具体操作流程如下:

  1. 在项目的设置界面中找到应用的 Target,然后选择 Capabilities 选项卡,然后会列出很多选项,往下拉就会找到 App Groups 选项,我们打开它的开关。如下图:

    (注意一点:打开 App Groups 需要关联你的苹果开发者账号。所以在这之前,你还需要拥有一个苹果开发者账号。)

  2. 成功开启后,会出现 App Groups 设置界面。点击下方的加号按钮,来添加一个新的 App Groups。如下图:

    App Groups 的命名规则和 Bundle Identifier 一样,都是使用反向 DNS 规则。比如 group.app.test
    添加完成后,新的 Group 就会显示在设置界面上,我们将它左边的复选框勾选上,就完成了。

  3. 到此为止,主 App 的设置步骤就完成了,下面我们还要对扩展 App 进行类似的操作。首先还是找到 App Groups 选项框,并打开开关。

    (注意:这次我们的 Target 选择的是 extension)

  4. 打开开关后,这次和刚才的操作步骤有所不同,因为我们之前已经创建过 App Groups 了,这次就不需要创建新的了,只需要点击 App Groups 设置界面中的刷新按钮,就可以看到我们之前创建过的 Group 了。

    然后勾选上即可完成 App 扩展Group 设置。

这些基本设置操作完成后,我们就可以在这两个 App 之间进行数据共享啦。大家可以想一想,我们用什么方法进行数据共享比较合适呢?

其实很简单啦,就是我们熟悉的 NSUserDefaults 了。相信每一位朋友对这个类都不陌生。没想到吧,它还有共享数据这个作用。如果仔细查看它的文档,你就会发现它还有这样一个初始化方法 initWithSuiteName: 而官方文档上对这个方法是这样解释的:

Returns an NSUserDefaults object initialized with the defaults for the specified app group.

看到了吧,里面提到了 App Group, 这个初始化方法就是为 App Group 量身打造的。如果有兴趣进一步研究,可以查看下 NSUserDefaults 的 官方文档。

下面我们就继续啦,App 数据共享即将大功告成。首先我们在主 App 中的 AppDelegate 中的 didFinishLaunchingWithOptions 方法中来写存入数据的代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -\> Bool {var defaultForExtension:NSUserDefaults! = NSUserDefaults(suiteName: "group.app.test")if(defaultForExtension != nil){defaultForExtension.setObject("2014", forKey: "year")defaultForExtension.synchronize()}return true}

有没有注意到这里面 NSUserDefaults 的构造方法NSUserDefaults(suiteName: "group.app.test") ,我们将前面我们创建的 App Groups 的标识作为参数传给了它的构造方法。这样,这个 NSUserDefaults 就专为我们的这个 App Group 存储数据了。

接下来,再到 App 扩展 中,再用这个 NSUserDefaults 将我们设置的值读取出来:

var defaultForExtension:NSUserDefaults! = NSUserDefaults(suiteName: "group.app.test")
if(defaultForExtension != nil){var result:NSString = defaultForExtension.objectForKey("year") as NSStringprintln(result)
}

到这里,我们的 AppExtension 之间的数据共享就完成了, 是不是解决了一个大问题呢。反正我觉得是。

更多文章请访问我的个人博客 www.theswiftworld.com

转载于:https://www.cnblogs.com/theswiftworld/p/4158590.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[探索 .NET 6]02 比较 WebApplicationBuilder 和 Host

这是『探索 .NET 6』系列的第二篇文章:01 揭开 ConfigurationManager 的面纱02 比较 WebApplicationBuilder 和 Host在 .NET 中,有一种新的“默认”方法用来构建应用程序,即使用 WebApplication.CreateBuilder()。在这篇文章中,我…

都怪爱因斯坦没说清楚!竟有人相信一个粉笔头就能让全人类多喝100年的热水?...

全世界只有3.14 % 的人关注了爆炸吧知识一个粉笔头一共能释放多少能量爱因斯坦大家肯定都熟悉,相信也有很多朋友听说过质能方程。根据质能方程的公式,我们发现:似乎能量和质量是可以相互转化的。尤其是一些没有系统学习过相对论,又…

从微信云托管容器镜像的选择-alpine 说起

微信云托管 使用目前主流的容器平台Docker以及容器编排技术Kubernetes(简称K8S),来管理你的项目。使用微信云托管需要掌握对Docker的使用,但你无需掌握K8S的使用方法。微信云托管将K8S的运维配置完全接手,你不需要关心…

H5移动开发AUI框架入门---博客园老牛大讲堂

大家都知道H5可以开发移动端的页面,网上提供的移动端的开发都有很多。因为我学习了AUI框架,所以我这里介绍一下移动端AUI框架。--博客园老牛大讲堂 一、AUI框架是什么?---博客园老牛大讲堂 AUI框架就是利用原生的js和css封装成的一些界面。当…

.NET6使用DOCFX根据注释自动生成开发文档

本文内容来自我写的开源电子书《WoW C#》,现在正在编写中,可以去WOW-Csharp/学习路径总结.md at master sogeisetsu/WOW-Csharp (github.com)来查看编写进度。预计2021年年底会完成编写,2022年2月之前会完成所有的校对和转制电子书工作&…

量子力学到底神奇在哪里?看完这个,我的认知彻底坍塌了

▲ 点击查看很多朋友应该都看过Facebook创始人扎克伯格给他的女儿讲量子力学的那张照片。扎克伯格在清华大学经济管理学院做演讲时,曾谈到:学习量子力学改变了他的思维方式。到底什么是量子力学?我们生活面对的物质尺度大约是厘米级到千米级之…

linux 路由表设置 之 route 指令详解

使用下面的 route 命令可以查看 Linux 内核路由表。 [cpp] view plaincopy# route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * …

黄老师离开呆了十年的上海

关注我的老朋友都知道,我和一线码农(黄新成)以前是同事,我以前也写过文章说过他的事迹。我们曾经一起共事过一家电商服务公司,每天和千万量级的数据打交道。.NET 圈的朋友想必很多人都看过一线码农写的技术文章&#x…

Shell配置_配置IP

1、setup 打开图形化页面a) 选择网络配置b) 选择设置配置c) 选择第一个网卡2、启动网卡(第一个网卡)vim /etc/sysconfig/network-scripts/ifcfg-eth0将ONBOOT"no"改为ONBOOT"yes"3、重启网络服务service network restart来自为知笔记…

linux之路由知识之ip route 命令中的疑惑

1.基础知识 1.1 路由 (Routing) 1.1.1 路由策略 (使用 ip rule 命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

python怎么执行程序_小鹅通视频怎么下载?用python实现小鹅通视频下载(二)

小鹅通视频怎么下载?用python实现小鹅通视频下载(二)背景上次分享《小鹅通视频怎么下载?用python实现小鹅通视频下载(一)[1]》后,引来了很多人咨询小鹅通视频怎么下载的问题。其实咨询的人大多是不懂python[2]语言的人,也有一部分…

在 Azure Functions 上使用不同的路由前缀

点击上方蓝字关注“汪宇杰博客”原文:Azure Tips and Tricks翻译:汪宇杰导语有时需要使用与 Azure Functions 自动生成的路由前缀不同的路由前缀。例如:https://mynewapimc.azurewebsites.net/api/HttpTriggerCSharp1 在函数名之前使用 api。…

RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总

2019独角兽企业重金招聘Python工程师标准>>> MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。 第一部分:Rab…

TMG学习(十一),保护企业内网上网安全

我们知道一个企业如果允许用户上网而且可以任意下载软件,这对于企业来说是非常危险的,用户无法辨别哪些是安全网站哪些网站存在风险,因此一旦用户在恶意网站上下载了软件,导致客户端中毒从而会影响整个企业内部网络,最…

sql跨表查询_跨表更新,看到自己写的SQL像个憨憨

有点 SQL 基础的朋友肯定听过 「跨表查询」,那啥是跨表更新啊?背景项目新导入了一批人员数据,这些人的有的部门名称发生了变化,有的联系方式发生了变化,暂且称该表为t_dept_members, 系统中有另外一张表 t_user_info 记…

iText创建一个含有中文的pdf文档

有朋友问我pdfbox支不支持向pdf文档中写入中文。然后试了好多遍都是有乱码,也找了好多资料没有找到解决办法。 但是在查找资料的过程中发现了另一个处理pdf的开源库iText.官方介绍 http://itextpdf.com/ 在这参考了两篇博客 博客1.pdfbox&iText生成PDF文件格式及…