iOS Today Extension NSUserDefaults使用回调共享包含应用程序的数据

时间:2014-11-07 13:21:14

标签: ios callback nsuserdefaults ios8-today-widget today-extension

我遇到了以下问题:

我创建了一个今日扩展,其中包含UISwitch。今天扩展中此开关的IBAction应使用NSUserDefaults和initWithSuite存储on-state,如下所示:

- (IBAction)switchStateChanged:(id)sender {

     BOOL isOn = self.preferenceSwitch.isOn;

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

    [sharedDefaults setBool: isOn forKey: @"SwitchState"];
    [sharedDefaults synchronize];
}

现在在我的Containing App中,我知道我可以使用它来访问开关状态:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.x.TodayExtensionSharingDefaults"];
BOOL value = [defaults boolForKey:@"SwitchState"];

我正在寻找一个解决方案,当我更改交换机的值时,我会在主内容应用中为我提供回调。

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

通过向sharedDefaults添加Observer是否有任何解决方案?

2 个答案:

答案 0 :(得分:0)

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

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

- (void)applicationWillResignActive:(UIApplication *)application
在AppDelegate中调用

。当你从小部件回来时,

- (void)applicationDidBecomeActive:(UIApplication *)application
在AppDelegate中调用

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

答案 1 :(得分:0)

观察应用程序中的更改并不是一个好的解决方案,即使您可以使其正常工作,因为当切换值发生变化时,您无法确定应用程序是否正在运行。这也不是今天扩展的目的。

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

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

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

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