繁体   English   中英

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

[英]iOS Today Extension NSUserDefaults Sharing Data with Containing App using Callbacks

我遇到以下问题:

我创建了Today Extension,它包含一个UISwitch Today Extension中此开关的IBAction应该使用NSUserDefaults和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 ,例如每200ms刷新一次用户默认设置。

通过将Observer添加到sharedDefaults,有什么解决方案吗?

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

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

- (void)applicationWillResignActive:(UIApplication *)application

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

- (void)applicationDidBecomeActive:(UIApplication *)application

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

即使您可以使应用程序正常工作,但观察它的更改也不是一个好的解决方案,因为当开关值更改时,您不确定应用程序是否正在运行。 今天的扩展也不打算如此工作。

如果您的应用需要在下次运行时知道此开关的状态(确认在轻按该开关时它可能未运行),那么您已经在做正确的事情。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM