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 提到了这一点。也许,这是显而易见的事情。但我写这篇文章是为了以防万一有人也错过了这件事。