【iOS小组件】App与小组件进行数据共享

565 阅读2分钟

前言

前面介绍了 App Groups 及数据共享需要的 Group IDGroup ID关联证书创建等准备,不清楚的可以查看【iOS小组件】小组件App ID、Group ID、描述文件。这次记录一下数据共享的实现过程。

App Groups 有两种共享数据的方式:

  • NSUserDefaults(用户偏好设置)

  • NSFileManager(文件管理)

NSUserDefaults共享数据

注意:

  • 使用 NSUserDefaults 进行数据共享并不意味着小组件可以直接读取主App存在偏好设置中的内容
  • 使用 NSUserDefaults 进行数据共享时,需要先在 主App 使用 Group ID 进行数据存储后,在 小组件 使用 同一个Group ID 进行数据读取

在主App中存值,主App与小组件共享数据必须使用 Group ID 进行存储数据

NSUserDefaults *groupInfo = [[NSUserDefaults alloc] initWithSuiteName: @"group.com.aa.bb.taskwidget"];
[groupInfo setObject:self.userLoginModel.username forKey:@"username"];
[groupInfo synchronize];

在小组件中获取

// 获取 App Group
let groupInfo = UserDefaults(suiteName: "group.com.aa.bb.taskwidget")

// 从App Group中获取指定key的value
if let username = groupInfo?.value(forKey: "username") as? String {
    print("username: \(username)")
}

以上代码已验证,放心使用。

NSFileManager共享数据

NSFileManagerNSUserDefaults 共享数据的形式类似,都需要通过 Group ID 进行关联设置读取。

在主App中存值

// 获取App Group的共享容器URL
let groupInfo = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.aa.bb.taskwidget")
let fileURL = groupInfo?.appendingPathComponent("myApp.txt")
// 确保fileURL是有效的
guard let validFileURL = fileURL else {
    print("Invalid file URL.")
    return
}

// 要写入的数据
let dataToWrite = "Hello, App Group!"
// 将字符串转换为Data对象
if let data = dataToWrite.data(using: .utf8) {
    do {
        // 尝试写入数据到文件
        try data.write(to: validFileURL, options: .atomic)
        print("Data written successfully.")
    } catch {
        // 处理写入过程中的错误
        print("Error writing data: \(error)")
    }
} else {
    print("Failed to convert string to Data.")
}

在小组件中获取

// 获取App Group的共享容器URL
let groupInfo = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.aa.bb.taskwidget")
// 拼接文件路径
let fileURL = groupInfo?.appendingPathComponent("myApp.txt")
// 确保fileURL是有效的
guard let validFileURL = fileURL else {
    print("Invalid file URL.")
    return
}
// 读取文件数据
do {
    let retrievedData = try Data(contentsOf: validFileURL)
    if let stringData = String(data: retrievedData, encoding: .utf8) {
        print("Data read successfully: \(stringData)")
    }
} catch {
    print("Error reading data: \(error)")
}

以上代码没有验证,仅供参考

本文同步自微信公众号 "程序员小溪" ,这里只是同步,想看及时消息请移步我的公众号,不定时更新我的学习经验。