IOS小组件(8):App与Widget数据共享
引言
Widget是一个迷你版的App,IOS有沙盒机制,不同App之间无法直接共享数据。组件和主App之间其实就是不同App的关系,所以也无法通过userdefaults.standard来传数据,苹果为了在不打破沙盒的前提下能够传数据,就想出了App Group的方法。
数据共享方式
可以通过网络和本地数据两种方式进行数据的共享,本地数据共享可以通过 App Groups。
App Groups 原理
它是 iOS 8 之后推出的在 App 之间共享数据的方式,只需要简单的配置就可以实现数据的共享。它主要用于同一group下的app共享同一份读写空间,以实现数据共享。编码 App Groups只能异步同步数据,当Widget读取数据的时候,只能读之前手机App保存的数据,相反也是如此。当手机App有新的数据保存时,不能及时的通知Widget更新数据,只能是Widget下次去主动获取数据。


配置证书
由于widget项目和主项目其实是两个独立的appID,因为需要单独给widget配置证书,配置证书的过程参考APP证书配置;
开启APP Groups
开启APP Groups是为了widget和app之间实现数据共享;为了便于后续操作,请先确保你的开发者账号在Xcode上处于登录状态。
在app中开启:
- TARGETS-->AppExtensionDemo-->Capabilities-->App Groups
- 找到以后,将App Groups右上角的开关打开,然后选择添加groups,注意命名要规范,比如:group.com.company.app;
在extension中开启
假设创建widget target的名称为TodayExtension,对应的App Group位于
- TARGETS-->TodayExtension-->Capabilities-->App Groups
- 开启的方式和APP中一样,注意必须要保证这里的App Groups名称和APP中相同。
App Groups特点
App Group容器只是在宿主app运行期间才存在,其中的容器用于扩展与宿主的文件共享,宿主被关闭了,共享也就没意义了。
以上来自于实际测试,测试过程是:在宿主app运行期间,点击其中的按钮弹出模态视图控制器,进行数据填充。完成后保存数据到App Group容器中的文件中,以供today extension扩展进行数据使用。只要将宿主app杀掉后重启启动宿主app,today extension 中已经显示的数据就完全没有了。单纯将宿主app杀掉不重启,today extension的任然hi显示之前的内容。由于宿主app中显示的数据也是从app group中的文件中取出来的,所以数据也没了。
由于这个共享机制的特殊性,这个容器不能用来长期保存文件!!!应该将文件存储到宿主app的文件夹中,可以长期存储。today extension展示的数据量较少,在合适的时候将其需要的数据搬运到app group中!
共享数据核心代码
FileManager实现创建一个文件夹
/*
* 创建并返回目录路径URL
*/
static private func makeShareFolderExists(folderName: String) -> URL? {
let documentsDirectory = FileManager().containerURL(forSecurityApplicationGroupIdentifier: groupId)
guard let folderURL = documentsDirectory?.appendingPathComponent(folderName) else { return nil}
var isDir : ObjCBool = false
var isExists = FileManager.default.fileExists(atPath: folderURL.path, isDirectory: &isDir)
if isExists && !isDir.boolValue {
do {
try FileManager.default.removeItem(at: folderURL)
isExists = false;
} catch {
return nil
}
}
if !isExists {
do {
try FileManager.default.createDirectory(atPath: folderURL.path, withIntermediateDirectories: true, attributes: nil)
} catch {
return nil
}
}
return folderURL
}
更多 FileManager 请查看官网Api https://developer.apple.com/documentation/foundation/filemanager/
参考
结语
本文讲解了App与小组件的数据共享方式是用App Groups机制来实现的,配置相关的请参考其他文章里面的详细操作步骤。另外请特别注意App Groups里面的数据不是永久的,只是暂存而已
IOS小组件(8):App与Widget数据共享的更多相关文章
- IOS小组件(6):小组件实现时钟按秒刷新
引言 上一节中我们了解了IOS小组件的刷新机制,发现根本没法实现按秒刷新,但是看别的App里面有做到,以为用了什么黑科技,原来是因为系统提供了一个额外的机制实现时间的动态更新,不用走小组件的刷新机 ...
- IOS 小组件(7):小组件点击交互
引言 前面我们似乎掌握了实现一个小组件所需要的一切技能,默认情况下桌面点击小组件,也正常跳转到了App中.接下来我们一起来看看,小组件是怎么做到点击跳转到App的. 点击交互方式 点击Widget ...
- 简单易用"里程碑"、"时间轴"<iOS小组件>
非常感谢,帮助我的朋友们,谢谢你们.上次我的好朋友指出了我编码上(jwTextFiled工具组件)存在一些不规范问题,这次注意提高. 呆毛地址:https://github.com/NIUXINGJI ...
- 自适应文案提示框、无数据图片加载<IOS小组件>
非常感谢,帮助我的朋友们,谢谢你们. 该组件的编写仅仅用来不到4个小时,包括测试与修改bug.为他起名为AdaptivePromptDialogBox(就是自适应文案提示框): 呆毛地址:链接 < ...
- Android开发工程师文集-1 小时学会Widget小组件开发
前言 大家好,给大家带来Android开发工程师文集-1 小时学会Widget小组件开发的概述,希望你们喜欢 学会用Widget (小组件) Widget小组件很方便,很快捷,可以个性化,自己定制,相 ...
- IOS Widget(5):小组件刷新机制
引言 前面的章节学完已经让我们可以顺利实现一个小组件了,但是小组件里面的数据如何刷新的呢,本节内容将讲解IOS的刷新机制. 大纲 系统如何管理小组件刷新 Timeline刷新机制 Timeline ...
- IOS Widget(3):SwiftUI开发小组件布局入门
引言 经过上一篇文章,我们已经可以在桌面上展示出一个小组件出来了,你肯定想小试牛刀,动手改一改,那我们就从改小组件的布局做起吧.本文不会讲解Swift语法,如果是熟悉Flutter,Kotlin这 ...
- IOS Widget(4-1):创建可配置小组件(静态配置数据)
引言 经过前面几篇文章阅读,已经掌握开发一款小组件的基本技能了,接下来开始掌握一些相对高级一点的技能.本文创建一个可配置小组件,通过修改时间类型,让Text空间显示不同格式的时间. 本文大纲 添加 ...
- Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!
Android Widget小组件开发(一)--Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的! PS:学习自某网站(不打广告) 这个小组件相信大家都很熟悉吧,以前的墨迹天气 ...
随机推荐
- 异步访问技术Ajax(XMLHttpRequest)
目录 AJAX XMLHttpRequest Ajax向服务器发送请求 Ajax接收服务器响应 AJAX - onreadystatechange 事件 使用 Callback 函数 一次Ajax请求 ...
- 修改linux默认文件创建权限-umask命令解析
umask值用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由umask值决定的. 对于root用户,系统默认的umask值是0022:对于普通用户, ...
- 在其他程序集访问internal类
前言 本文将介绍如何在其他程序集访问internal类的方法 首先我们新建一个解决方案,其中同时新建两个类库FooALibray和FooALibray,如下: 其中FooA类代码如下: intern ...
- 测试报告$\alpha$
pytorch可视化编程网站VisualPytorch NAG \(\alpha\)版本发布了!点击网址访问:VisualPytorch 一.测试查虫(bug detection) 测试贯穿了开发.集 ...
- 在ActiveMQ中使用SingleConnectionFactory遇到的坑
我们在生产环境使用了ActiveMQ作为消息中间件,消息中间件连接到数据库对消息进行持久化. 最近发生了一个奇怪的事情,消费者端的生产日志总是报如下错误: The JMS connection has ...
- 使用 Yarn workspace,TypeScript,esbuild,React 和 Express 构建 K8S 云原生应用(一)
本文将指导您使用 K8S ,Docker,Yarn workspace ,TypeScript,esbuild,Express 和 React 来设置构建一个基本的云原生 Web 应用程序. 在本教程 ...
- Flink使用二次聚合实现TopN计算
一.背景说明: 有需求需要对数据进行统计,要求每隔5分钟输出最近1小时内点击量最多的前N个商品,数据格式预览如下: 543462,1715,1464116,pv,1511658000 662867,2 ...
- golang:net/http理解总结
Go语言标准库内建提供了net/http包,涵盖了HTTP客户端和服务端的具体实现.使用net/http包,我们可以很方便地编写HTTP客户端或服务端的程序. http服务端的创建流程 在使用http ...
- 在/etc/profile下配置java的环境变量
在/etc/profile下配置java的环境变量 原创 Java 作者:xiaoyan5686670 时间:2016-01-18 14:30:28 6152 0 以root用户编辑:#vi /e ...
- Linux_进程管理相关命令
一.进程管理命令 1.ps -- 进程查看命令 1️⃣:ps(process state)命令用于列出当前的进程 2️⃣:可以显示详细的进程信息,包括: 用户识别符(UID),它确定进程的特权 唯一进 ...