NSUserDefaultsDidChangeNotification 未发送
NSUserDefaultsDidChangeNotification not sent
在 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");
});
您可以使用容器应用程序中的 CFNotificationCenter
来 post 向您的扩展应用程序发送跨进程通知。
共享常量:
const string id = "group.sushihangover";
const string key = "LastUpdateTime";
容器应用程序/在您的 NSUserDefaults 对象上设置观察者:
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
权利 必须 在两个容器中设置应用程序和今日扩展应用程序。
因此,SushiHangover 提供了一段完美的代码。
但是,问题出在 Info.plist
文件中。为了能够交换通知,应为具有 Remote Notification
功能的应用程序启用 Background Mode
。这听起来像是一件很明显的事情,但是我读过的使用 User Defaults
在扩展和应用程序之间交换数据的教程中 none 提到了这一点。也许,这是显而易见的事情。但我写这篇文章是为了以防万一有人也错过了这件事。
在 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");
});
您可以使用容器应用程序中的 CFNotificationCenter
来 post 向您的扩展应用程序发送跨进程通知。
共享常量:
const string id = "group.sushihangover";
const string key = "LastUpdateTime";
容器应用程序/在您的 NSUserDefaults 对象上设置观察者:
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
权利 必须 在两个容器中设置应用程序和今日扩展应用程序。
因此,SushiHangover 提供了一段完美的代码。
但是,问题出在 Info.plist
文件中。为了能够交换通知,应为具有 Remote Notification
功能的应用程序启用 Background Mode
。这听起来像是一件很明显的事情,但是我读过的使用 User Defaults
在扩展和应用程序之间交换数据的教程中 none 提到了这一点。也许,这是显而易见的事情。但我写这篇文章是为了以防万一有人也错过了这件事。