2

我有以下问题:

我创建了一个 Today Extension,其中包含一个UISwitch. NSUserDefaultsToday Extension 中此开关的 IBAction 应使用initWithSuite存储开启状态,如下所示:

- (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例如每 200 毫秒刷新一次用户默认值。

通过将观察者添加到 sharedDefaults 是否有任何解决方案?

4

2 回答 2

0

观察你的应用程序的变化并不是一个好的解决方案,即使你可以让它工作,因为当开关值改变时你甚至不能确定你的应用程序是否正在运行。这也不是今天扩展的工作方式。

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

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

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

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

于 2014-11-12T21:21:43.693 回答
0

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

当你离开你的应用程序并打开通知中心时,

- (void)applicationWillResignActive:(UIApplication *)application

在您的 AppDelegate 中调用。当你从小部件回来时,

- (void)applicationDidBecomeActive:(UIApplication *)application

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

于 2014-11-10T17:14:25.177 回答