首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >NSUserDefaultsDidChangeNotification未发送

NSUserDefaultsDidChangeNotification未发送
EN

Stack Overflow用户
提问于 2017-08-31 09:16:38
回答 2查看 563关注 0票数 1

在处理iOS应用程序和今天扩展程序之间的数据共享时,我面临的问题是,当我更改UserDefaults时,无论是从主应用程序还是从扩展程序都无法发送NSUserDefaultsDidChangeNotification。问题是,我可以成功地为我创建的App读写数据到UserDefaults。所以数据实际上是由应用程序和扩展程序共享的。但是从未触发(或检测到) UserDefaults更改通知。有人能告诉我什么是问题吗?

UserDefaults中数据的写入

代码语言:javascript
代码运行次数:0
运行
复制
NSUserDefaults defaults = new NSUserDefaults("group.com.name1.name2",NSUserDefaultsType.SuiteName);
defaults.SetString("UPDATE " + DateTime.Now.Minute, "data");
defaults.Synchronize();

通知处理程序

代码语言:javascript
代码运行次数:0
运行
复制
NSNotificationCenter.DefaultCenter.AddObserver(
                NSValueTransformer.UserDefaultsDidChangeNotification, (notification) => {
    NSUserDefaults defaults = new NSUserDefaults("group.com.name1.name2",NSUserDefaultsType.SuiteName);
    string str = defaults.StringForKey("data");  
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-06 07:29:56

因此,SushiHangover提供了完全工作的代码。但是,问题在Info.plist文件中。为了能够交换通知,应该启用带有Remote Notification功能的应用程序的Remote Notification。这听起来是一件很明显的事情,但我所读到的在扩展和应用程序之间使用User Defaults交换数据的教程中没有提到这一点。也许,这是一件显而易见的事情。但我写这个是为了防止有人也错过了这件事。

票数 -1
EN

Stack Overflow用户

发布于 2017-08-31 12:45:15

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

共享常量:

代码语言:javascript
代码运行次数:0
运行
复制
const string id = "group.sushihangover";
const string key = "LastUpdateTime";

容器应用程序/在您的NSUserDefaults对象上设置一个观察者:

代码语言:javascript
代码运行次数:0
运行
复制
var todayWidgetUserDefaults = new NSUserDefaults(id, NSUserDefaultsType.SuiteName);

NSValueTransformer.Notifications.ObserveUserDefaultsDidChange(todayWidgetUserDefaults,(sender, e) => 
{
     CFNotificationCenter.Darwin.PostNotification(id, todayWidgetUserDefaults, null, true, true);
});

今天扩展应用程序:

代码语言:javascript
代码运行次数:0
运行
复制
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 Today

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45977747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档