在处理iOS应用程序和今天扩展程序之间的数据共享时,我面临的问题是,当我更改UserDefaults时,无论是从主应用程序还是从扩展程序都无法发送NSUserDefaultsDidChangeNotification。问题是,我可以成功地为我创建的App读写数据到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");
});
发布于 2017-09-05 23:29:56
因此,SushiHangover提供了完全工作的代码。但是,问题在Info.plist
文件中。为了能够交换通知,应该启用带有Remote Notification
功能的应用程序的Remote Notification
。这听起来是一件很明显的事情,但我所读到的在扩展和应用程序之间使用User Defaults
交换数据的教程中没有提到这一点。也许,这是一件显而易见的事情。但我写这个是为了防止有人也错过了这件事。
发布于 2017-08-31 04:45:15
您可以使用容器应用程序中的CFNotificationCenter
向扩展应用程序发布跨进程通知。
共享常量:
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
Today 。
https://stackoverflow.com/questions/45977747
复制