iOS Today扩展NSUserDefault使用回调与包含应用程序共享数据

iOS Today扩展NSUserDefault使用回调与包含应用程序共享数据,ios,callback,nsuserdefaults,ios8-today-widget,today-extension,Ios,Callback,Nsuserdefaults,Ios8 Today Widget,Today Extension,我有以下问题: 我创建了一个Today扩展,其中包含一个UISwitch。今天扩展中此开关的iAction应使用initWithSuite的NSUserDefaults存储打开状态,如下所示: - (IBAction)switchStateChanged:(id)sender { BOOL isOn = self.preferenceSwitch.isOn; NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc]

我有以下问题:

我创建了一个Today扩展,其中包含一个
UISwitch
。今天扩展中此开关的iAction应使用initWithSuite的
NSUserDefaults
存储打开状态,如下所示:

- (IBAction)switchStateChanged:(id)sender {

     BOOL isOn = self.preferenceSwitch.isOn;

     NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];

    [sharedDefaults setBool: isOn forKey: @"SwitchState"];
    [sharedDefaults synchronize];
}
现在,在我的应用程序中,我知道我可以使用以下命令访问交换机状态:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];
BOOL value = [defaults boolForKey:@"SwitchState"];
我正在寻找一种解决方案,当开关的值发生变化时,它会在我的主应用程序中给我一个回调

在这个解决方案中,我必须设置一个
NSTimer
,例如每200ms刷新一次用户默认值


通过向sharedDefaults添加一个观察者,有什么解决方案吗?

我认为这将适用于您的用例:

当您离开应用程序并打开通知中心时

- (void)applicationWillResignActive:(UIApplication *)application
在AppDelegate中调用。当你从窗口小部件返回时

- (void)applicationDidBecomeActive:(UIApplication *)application

在AppDelegate中调用。因此,只需检查您的值,然后向控制器发出内部通知。你不应该需要计时器。

观察应用程序中的更改不是一个好的解决方案,即使你可以让它工作,因为当开关值更改时,你无法确定应用程序是否正在运行。这也不是今天的扩展是如何工作的

如果你的应用程序在下次运行时需要知道这个开关的状态(意识到当开关被点击时它可能没有运行),那么你已经在做正确的事情了

如果您需要立即通知您的应用程序开关值已更改(再次确认您的应用程序可能未运行,并且这样做可能会启动您的应用程序),您应该为应用程序创建自定义URL方案,然后从扩展打开URL。这将类似于:

  • 在应用程序中,在应用程序“信息”设置的“URL类型”部分声明自定义URL方案
  • 同样在应用程序中,向应用程序委托添加代码以接收打开URL的请求
  • 在应用程序扩展中,使用
    [NSExtensionContext openURL:completionHandler://code>打开URL。这将启动你的应用程序并传递提供的URL

如果URL方案类似于
mygreatapp
,则应用程序扩展将打开类似于
mygreatapp:
的URL。如果需要,您可以向URL添加详细信息,或者应用程序可以使用用户默认值查找保存的值。

谢谢您的回答。但我正在寻找一种解决方案,它可以直接通知我的包含应用程序在切换状态更改时在后台执行一些任务。啊,我明白了。如何将pref文件保存到共享应用程序组容器并侦听对其所做的更改。谢谢您的回答。我想实现这一点,但是,如何向todayextension发出内部通知?