前言
前面介绍了 App Groups 及数据共享需要的 Group ID、Group 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共享数据
NSFileManager 与 NSUserDefaults 共享数据的形式类似,都需要通过 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)")
}
以上代码没有验证,仅供参考
本文同步自微信公众号 "程序员小溪" ,这里只是同步,想看及时消息请移步我的公众号,不定时更新我的学习经验。