NSUserDefaultsDidChangeNotification未发送

时间:2017-08-31 09:16:39

标签: ios xamarin xamarin.ios nsuserdefaults today-extension

在处理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");  
});

2 个答案:

答案 0 :(得分:1)

您可以使用容器应用中的CFNotificationCenter向您的扩展应用发布跨进程通知。

共享常量:

const string id = "group.sushihangover";
const string key = "LastUpdateTime";

容器app /在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权利 必须 在您的容器应用和今日推广应用中设置。

答案 1 :(得分:-1)

因此,SushiHangover提供了完美的代码。 但是,问题出在Info.plist文件中。为了能够更换通知,应为具有Background Mode功能的应用启用Remote Notification。这听起来是一件非常明显的事情,但是在我读到的提及User Defaults的扩展和应用之间交换数据的教程都没有提到这一点。也许,这是显而易见的事情。但我写这篇文章是因为有人可能也错过了这件事。