在处理iOS应用和Today Extension之间的数据共享时,我遇到了一个问题,即当我更改UserDefaults时,NSUserDefaultsDidChangeNotification永远不会从主应用程序或扩展程序发送。问题是我可以为我创建的应用程序组成功读取和写入UserDefaults的数据。因此,数据实际上是由应用和扩展共享的。但是永远不会触发(或检测到)UserDefaults更改的通知。有人可以告诉我什么是问题吗?
在UserDefaults中写入数据
NSUserDefaults defaults = new NSUserDefaults("group.com.name1.name2",NSUserDefaultsType.SuiteName);
defaults.SetString("UPDATE " + DateTime.Now.Minute, "data");
defaults.Synchronize();
通知处理程序
NSNotificationCenter.DefaultCenter.AddObserver(
NSValueTransformer.UserDefaultsDidChangeNotification, (notification) => {
NSUserDefaults defaults = new NSUserDefaults("group.com.name1.name2",NSUserDefaultsType.SuiteName);
string str = defaults.StringForKey("data");
});
答案 0 :(得分:1)
您可以使用容器应用中的CFNotificationCenter
向您的扩展应用发布跨进程通知。
const string id = "group.sushihangover";
const string key = "LastUpdateTime";
var todayWidgetUserDefaults = new NSUserDefaults(id, NSUserDefaultsType.SuiteName);
NSValueTransformer.Notifications.ObserveUserDefaultsDidChange(todayWidgetUserDefaults,(sender, e) =>
{
CFNotificationCenter.Darwin.PostNotification(id, todayWidgetUserDefaults, null, true, true);
});
var todayWidgetUserDefaults = new NSUserDefaults(id, NSUserDefaultsType.SuiteName);
void ObserverAction(string notificationId, NSDictionary userInfo)
{
if (notificationId == id)
{
Console.WriteLine(todayWidgetUserDefaults.StringForKey(key));
}
}
var observerToken = CFNotificationCenter.Darwin.AddObserver(id, todayWidgetUserDefaults, ObserverAction, CFNotificationSuspensionBehavior.DeliverImmediately);
注意: App Group
权利 必须 在您的容器应用和今日推广应用中设置。
答案 1 :(得分:-1)
因此,SushiHangover提供了完美的代码。
但是,问题出在Info.plist
文件中。为了能够更换通知,应为具有Background Mode
功能的应用启用Remote Notification
。这听起来是一件非常明显的事情,但是在我读到的提及User Defaults
的扩展和应用之间交换数据的教程都没有提到这一点。也许,这是显而易见的事情。但我写这篇文章是因为有人可能也错过了这件事。