在 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,一经查实,立即删除!

相关文章

Java8 (1)

参考资料: 《Java8 in Action》 Raoul-Gabriel Urma 一、jdk8 客观的说,Java8是一次有重大演进的版本,甚至很多人认为java8所做的改变,在许多方面都比Java历史上任何一次改变都深远。 Scala,python这样优秀编程语言中对…

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

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

python计算公式分母有0_你知道Python中的浮点除法和积分除法吗,python,float,整除,都...

从python2.2开始,便有两种除法运算符:"/"、"//"。两者最大区别在:python2.2前的版本和python2.2以后3.0以前的版本的默认情况下,"/"所做的除法是以一种两个数或者多个数出现一个浮点数结果就以浮点…

计算机科学概论(2)数据的操控和程序的执行

1.CPU是什么?它有什么作用?CPU(Central Processing Unit,中央处理器)负责操控数据在不同位置间的移动及对数据进行处理。它是计算机的核心部件。它主要由三个部分组成:算数/逻辑单元、控制单元、寄存器单元。算数逻辑单元负责在数…

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

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

linux环境下用TcpDump抓包分析总结

1、手机IP 怎么知道手机ip,输入下面命令 adb shellifconfig 比如得到手机ip 2.0.0.1 2、目标IP 比如目标地址ip为10.0.0.1 3、抓包命令 我们不带端口命令如下 tcpdump -i any host 2.0.0.1 -nv 代码端口的命令如下(端口为50129) tcpdump -i any host 2.0.0.1 and port…

UVa 12100 - Printer Queue

刚A完图书系统那道题&#xff0c;然后看提交次数那个字典的比这道题多&#xff0c;看了看那道更新字典没有思路&#xff0c;就看了这道题&#xff0c;感觉这道题比更新字典简单多了。 #include<iostream> #include<queue> #include<map> using namespace std…

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

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

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

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

python画樱桃小丸子_每天坚持画画|简笔画练习“樱桃小丸子”

《樱桃小丸子》也是80后的经典回忆&#xff0c;特别是女生们。你们可能不知道如果按实际年龄来算小丸子今年已经52岁了(1965年5月8日出生)可想而知这部动画片的影响力有多大。【今日主题】《樱桃小丸子》樱桃子BY&#xff1a;网络&#xff0c;侵删【完成图】BY&#xff1a;纳豆…

linux操作命令等积累

1&#xff0c;启动服务&#xff1a;两种方式&#xff1a; /etc/init.d/networking start /etc/init.d/mysql start #:service mysql start service networking start(stop,restart) $:sudo service mysql start(stop,restart) 2, linux 程序安装位置&#xff1a;多数位于/v…

linux之gdb调试常用100个技巧

linux之gdb调试常用100个技巧 https://gitlore.com/page/gitlore-git/gdb_tips/index.html 如果不懂linux gdb调试的 看下这篇文章 详细解说

制造价值基本方程

财富来自于自然资源、生产制造和服务。 未经加工的自然资源是价值低或没有用的&#xff0c;服务也必须和生产制造联系起来才能增加财富。 生产制造是增加财富的核心手段。 ERP enterprise resources planning 企业资源计划 -- 是管理的理念和工具。 制造要回答的问题&#xff1…

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

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

Oracle数据库-主键(primary key)、外键(foreign key)、候选键(candidate key)、超键(super key)和references总结...

主要介绍一下个人对主键&#xff08;primary key&#xff09;、外键&#xff08;foreign key&#xff09;、候选键&#xff08;Candidate key&#xff09;、超键&#xff08;super key&#xff09;、references的总结 概念&#xff1a; 主键&#xff1a;用户选择元组标识的一个…

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

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

python开机号_感知机(python实现)

感知机(perceptron)是二分类的线性分类模型&#xff0c;输入为实例的特征向量&#xff0c;输出为实例的类别(取1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面&#xff0c;为求得超平面导入了基于误分类的损失函数&#xff0c;利用梯度下…

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 * …