![](/img/trans.png)
[英]How to share data with containing app using NSUserDefaults ? - Today Extension Widget
[英]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从扩展名。 就像这样:
[NSExtensionContext openURL:completionHandler:]
打开URL。 这将启动您的应用并传递提供的URL。 如果该URL方案类似于mygreatapp
,则应用扩展mygreatapp:
打开一个类似于mygreatapp:
的URL。 您可以根据需要在URL中添加详细信息,或者应用程序可以仅使用用户默认值来查找保存的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.