当前位置: 代码迷 >> 综合 >> iOS14 Widget开发踩坑(三)数据通信与用户配置
  详细解决方案

iOS14 Widget开发踩坑(三)数据通信与用户配置

热度:1   发布时间:2023-12-26 01:53:52.0

iOS14 Widget开发踩坑(三)数据传递与用户配置

  • 前言
  • 数据传递方式
    • NSUserDefault
    • NSFileManager
    • 数据库
  • 用户配置
  • 遇到的问题
  • 参考文献

前言

本文主要是我在写项目时学习到的知识和经验,可能存在错误的地方,仅供学习思路参考,欢迎大家一起讨论学习。

数据传递方式

主程序与Extension之间的通信属于Target之间的通信,所以还是有本地通信和服务器通信两种,这里我主要记录本地数据通信的两种。NSUserDefaultNSFileManager,都得依赖于AppGroup的设置,因为文件的数据需要存储到两个Target都能访问到的区域内,下面是两者的区别。

NSUserDefault

NSUserDefault的本质是一个plist文件,适合存储一些轻量级的用户配置信息。
通过initWithSuiteName方法可以创建一个AppGroup中的成员能够访问到的plist。其优势在于:线程安全、读写方便、易于管理。

// OC写入
NSUserDefault *ud = [[NSUserDefaults alloc] initWithSuiteName:@"这里是AppGroup的字符串"];
[ud setObject:@"需要保存的数据" forKey:@"数据的Key"];
[ud synchronize];// Swift写入
let ud = UserDefaults(suiteName: "这里是AppGroup的字符串")!;
ud.setValue(@"需要保存的数据", forKey: @"数据的Key")
ud.synchronize()// Swift读取
let ud = UserDefaults(suiteName: "这里是AppGroup的字符串")!
let obj = ud.value(forKey: "数据的Key")
if obj == nil {
    // 
} else {
    //
} 

NSFileManager

原理就是主程序将需要的数据保存到一个两个Target都能访问到的文件内,Widget需要时按照设定好的方式读取这个文件的数据并展示即可。NSFileManager相较于NSUserDefault优势在于可以保存的数据量大。

// 设置文件的统一资源定位符
NSURL *fileURL = [[NSFileManager defaultManager]containerURLForSecurityApplicationGroupIdentifier:@"这里是AppGroup的字符串"];
fileURL = [fileURL URLByAppendingPathComponent:@"你的文件名"];
// 使用NSFileManager进行文件保存
xxxx

数据库

从上面两个保存方式我们明白了,只需要把文件存放在AppGroup的公共区域内,Group内的其他Target能访问到,那么我们就可以将数据库放置到这个目录下,只要保证数据库的线程安全,就能取到正确的数据。具体选择什么数据库就看个人喜好和项目要求了。我使用的是Realm,在主程序对数据进行存储,在Widget根据数据id进行数据读取。

用户配置

WidgetKit的用户配置界面是使用SiriKitintentdefinition文件进行配置的,并不需要单独设计界面显示。还可以使用IntentExtension提供数据选择。用户只需要长按小组件后选择编辑小组件选项,即可进入编辑界面。可以进行位置选择、数据控制、文本输入、选项、开关等操作.。在这里插入图片描述
具体配置方法和设置请参考以下几篇文章,这里就不再过度赘述。在这里重点写一下我在写这部分时遇到的问题。
[iOS14]WidgetKit开发实战3-小部件用户配置.
【iOS14】仿网易云桌面小组件(三).
iOS14 WidgetKit小试牛刀-用户配置与intent.
Add configuration and intelligence to your widgets

遇到的问题

1、IntentExtensionDeployment Info中iOS的版本一定要检查一下是否是你需要的版本,我添加上去默认了iOS14.2,但是我的项目和手机是iOS 14的,就导致了无法读取数据的问题。

2、IntentExtension一定要和WidgetExtension和主程序在同一个AppGroup中,不然也无法读取到数据。

3、IntentExtension有时无法找到相应的Intent,是因为Intent在创建后需要Xcode生成相应的代码文件有时Xcode没有及时加载上导致的,可以在重启Xcode试试。
或者是intentdefinition文件的Target MemberShip没有勾选IntentExtension,在进行多个Target之间操作的时候一定要注意文件的Target MemberShip
也可能是该参数没有设置Dynamic Options选项,勾选上即可。

参考文献

[iOS14]WidgetKit开发实战3-小部件用户配置.
iOS14 WidgetKit小试牛刀-用户配置与intent.
【iOS14】仿网易云桌面小组件(三).
Swift-Realm数据库的使用详解
iOS小组件Widget踩坑
iOS小组件Widget从0到1开发
Add configuration and intelligence to your widgets

  相关解决方案