引言

  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数据共享的更多相关文章

  1. IOS小组件(6):小组件实现时钟按秒刷新

    引言   上一节中我们了解了IOS小组件的刷新机制,发现根本没法实现按秒刷新,但是看别的App里面有做到,以为用了什么黑科技,原来是因为系统提供了一个额外的机制实现时间的动态更新,不用走小组件的刷新机 ...

  2. IOS 小组件(7):小组件点击交互

    引言   前面我们似乎掌握了实现一个小组件所需要的一切技能,默认情况下桌面点击小组件,也正常跳转到了App中.接下来我们一起来看看,小组件是怎么做到点击跳转到App的. 点击交互方式 点击Widget ...

  3. 简单易用"里程碑"、"时间轴"<iOS小组件>

    非常感谢,帮助我的朋友们,谢谢你们.上次我的好朋友指出了我编码上(jwTextFiled工具组件)存在一些不规范问题,这次注意提高. 呆毛地址:https://github.com/NIUXINGJI ...

  4. 自适应文案提示框、无数据图片加载<IOS小组件>

    非常感谢,帮助我的朋友们,谢谢你们. 该组件的编写仅仅用来不到4个小时,包括测试与修改bug.为他起名为AdaptivePromptDialogBox(就是自适应文案提示框): 呆毛地址:链接 < ...

  5. Android开发工程师文集-1 小时学会Widget小组件开发

    前言 大家好,给大家带来Android开发工程师文集-1 小时学会Widget小组件开发的概述,希望你们喜欢 学会用Widget (小组件) Widget小组件很方便,很快捷,可以个性化,自己定制,相 ...

  6. IOS Widget(5):小组件刷新机制

    引言   前面的章节学完已经让我们可以顺利实现一个小组件了,但是小组件里面的数据如何刷新的呢,本节内容将讲解IOS的刷新机制. 大纲 系统如何管理小组件刷新 Timeline刷新机制 Timeline ...

  7. IOS Widget(3):SwiftUI开发小组件布局入门

    引言   经过上一篇文章,我们已经可以在桌面上展示出一个小组件出来了,你肯定想小试牛刀,动手改一改,那我们就从改小组件的布局做起吧.本文不会讲解Swift语法,如果是熟悉Flutter,Kotlin这 ...

  8. IOS Widget(4-1):创建可配置小组件(静态配置数据)

    引言   经过前面几篇文章阅读,已经掌握开发一款小组件的基本技能了,接下来开始掌握一些相对高级一点的技能.本文创建一个可配置小组件,通过修改时间类型,让Text空间显示不同格式的时间. 本文大纲 添加 ...

  9. Android Widget小组件开发(一)——Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的!

    Android Widget小组件开发(一)--Android实现时钟Widget组件的步骤开发,这些知识也是必不可少的! PS:学习自某网站(不打广告) 这个小组件相信大家都很熟悉吧,以前的墨迹天气 ...

随机推荐

  1. hdu4908 中位数子串

    题意:       给你N个数字组成的数列,然后问你这里面有多少个是以M为中位数的子序列. 思路:       首先分四中简单的情况求        (1) 就是只有他自己的那种情况 那么sum+1 ...

  2. 逆向 ctype.h 函数库 isalnum、iscntrl、islower、isxdigit、tolower 函数

    0x01 isalnum 函数 函数原型:int isalnum(int c); 函数功能:检查所传的字符是否是字母和数字 动态链接库:ucrtbase.dll C\C++ 实现: #define _ ...

  3. (CV学习笔记)看图说话(Image Captioning)-2

    实现load_img_as_np_array def load_img_as_np_array(path, target_size): """从给定文件[加载]图像,[缩 ...

  4. HellowWorld详解

    1.随便新建一个文件夹,存放代码 2.在文件夹中新建一个Java文件 新建一个.txt文本文档-->将扩展名.txt修改为.java 注:如果创建的文本文档没有显示扩展名,则有如下方法: 方法一 ...

  5. 动态类型转换dynamic_cast

    C++Primer第十九章的动态类型转换部分讲的不是很清楚,于是自己查cpp的官方手册总结一下. dynamic_cast < new-type > ( expression ) 动态类型 ...

  6. 『政善治』Postman工具 — 12、Postman中实现数据驱动

    目录 1.什么是数据驱动? 2.测试集说明 3.创建请求与准备数据文件 (1)新增学院结果文档内容如下 (2)编写数据文件 (3)在Postman中创建请求 4.实现Postman中的数据驱动 步骤1 ...

  7. sed -i 's/Search_String/Replacement_String/g' Input_File sed详细手册

    本文列出的十五个例子可以帮助你掌握 sed 命令.如果要使用 sed 命令删除文件中的行,去下面的文章.注意:由于这是一篇演示文章,我们使用不带 -i 选项的 sed 命令,该选项会在 Linux 终 ...

  8. 什么是环境变量,Linux环境变量及作用 echo

    什么是环境变量,Linux环境变量及作用 < Linux命令的执行过程是怎样的?(新手必读)Linux PATH环境变量是什么,有什么用?(入门必读) > <Linux就该这么学&g ...

  9. Docker——Registry 通过Shell管理私有仓库镜像

    使用方法: 复制代码保存为 image_registry.sh sh image_registry.sh  -h   #查看帮助 HUB=10.0.29.104:5000 改为自己的地址 #!/bin ...

  10. 优秀电路资料--- IOT方案

    完整的IOT方案 http://www.cirmall.com/circuit/4117/%E3%80%90%E5%BC%80%E6%BA%90%E3%80%91%E5%AE%8C%E6%95%B4% ...