【发布时间】:2018-10-13 09:57:55
【问题描述】:
在我的项目中,我需要将用户 ID 发送到 iOS 中的小部件。但为此,我的用户需要打开一次应用程序。不打开,信息只保留1天,之后消失,小部件停止显示信息并等待打开应用程序。
为此,我使用了 appGroup。
使用从我的项目传输数据到小部件的正确方法是什么?
【问题讨论】:
在我的项目中,我需要将用户 ID 发送到 iOS 中的小部件。但为此,我的用户需要打开一次应用程序。不打开,信息只保留1天,之后消失,小部件停止显示信息并等待打开应用程序。
为此,我使用了 appGroup。
使用从我的项目传输数据到小部件的正确方法是什么?
【问题讨论】:
您需要在用户默认值中设置一个字典值并像这样在小部件中读取它
var dic:[String:String] = ["DateStr":"ID"]
获取小部件中的日期并读取默认值(如果存在)并查找匹配的 DateStr
请注意每次打开应用时更新 dic
【讨论】:
为此,我使用了 appGroup。
使用从我的项目传输数据到的正确方法是什么 小部件?
到目前为止,您所做的(应用分组)是您应该遵循的步骤之一。接下来,如App Extension Programming Guide - Sharing Data with Your Containing App中提到的:
启用应用组后,应用扩展及其包含的应用 都可以使用
NSUserDefaultsAPI 来共享用户访问权限 优先。要启用此共享,请使用initWithSuiteName:方法 实例化一个新的 NSUserDefaults 对象,传入标识符 共享组的。
所以,到目前为止,您要做的就是让UserDefautls传输数据。例如:
if let userDefaults = UserDefaults(suiteName: "group.com.example.myapp") {
userDefaults.set(true, forKey: "myFlag")
}
因此您可以将其传递给小部件:
if let userDefaults = UserDefaults(suiteName: "group.com.example.myapp") {
let myFlag = userDefaults.bool(forKey: "myFlag")
}
并且您采用相同的方法来传递数据,反之亦然(从小部件到项目)。
【讨论】:
斯威夫特 5
按照这些步骤将数据从主机应用程序传递到扩展程序。
if let userDefaults = UserDefaults(suiteName: "group.com.yourAppgroup") {
createEventDic.removeAll()
let eventDic = NSMutableDictionary()
eventDic.setValue("YourString", forKey: "timeFontName")
createEventDic.append(eventDic)
let resultDic = try? NSKeyedArchiver.archivedData(withRootObject: createEventDic, requiringSecureCoding: false)
userDefaults.set(resultDic, forKey: "setWidget")
userDefaults.synchronize()
} else {
}
if let userDefaults = UserDefaults(suiteName: "group.com.yourAppGroup") {
guard let testcreateEvent = userDefaults.object(forKey: "testcreateEvent") as? NSData else {
print("Data not found in UserDefaults")
return
}
do {
guard let eventsDicArray = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(testcreateEvent as Data) as? [NSMutableDictionary] else {
fatalError("loadWidgetDataArray - Can't get Array")
}
for eventDic in eventsDicArray {
let timeFontName = eventDic.object(forKey: "timeFontName") as? String ?? ""
}
} catch {
fatalError("loadWidgetDataArray - Can't encode data: \(error)")
}
}
希望它会有所帮助。干杯!
【讨论】:
.synchronize()。实际上,这已被弃用,并且文档宣传不使用它。
在 Xamarin Forms 中,我们需要使用 DI 将数据传递给 ios 项目,然后我们可以将其放入 NSUserDefaults 信息:分组申请是强制性的
Xamarin iOS 项目 - 将数据放入 NSUserDefaults
var plist = new NSUserDefaults("group.com.test.poc", NSUserDefaultsType.SuiteName);
plist.SetBool(true, "isEnabled");
plist.Synchronize();
Today Extension - 从 NSUserDefaults 获取数据
var plist = new NSUserDefaults("group.com.test.poc", NSUserDefaultsType.SuiteName);
var result = plist.BoolForKey("isEnabled");
Console.WriteLine($"The result of NSUserdefaults: logesh {result}");
【讨论】: