我正在开发一个带有Today Extension的iPhone应用程序.该应用程序有一个模型模块,可以加载/保存到NSUserDefaults.由于我希望主要应用和扩展程序都可以使用此信息,因此我使用了一个应用程序组:
let storage = NSUserDefaults(suiteName: "group.etc.etc.etc...")
Run Code Online (Sandbox Code Playgroud)
应用程序和扩展程序都可以毫无问题地访问信息.
主应用程序偶尔可能会创建一个本地通知以呈现给用户.该通知有两个与之关联的操作(UIUserNotificationAction).其中一个操作会触发一些代码在主应用程序的后台运行.该代码更改NSUserDefaults信息并触发同步.我的代码是这样的:
func application(application: UIApplication, handleActionWithIdentifier id: String?, forLocalNotification not: UILocalNotification, completionHandler: () -> ()) {
// Interact with model here
// New information gets saved to NSUserDefaults
userDefaultsStorage.synchronize()
completionHandler()
}
Run Code Online (Sandbox Code Playgroud)
现在,在今天外线.我自然会观察对信息所做的任何更改,NSUserDefaults以便我可以在窗口小部件上重新加载界面:
override func viewDidLoad() {
super.viewDidLoad()
// ...
NSNotificationCenter.defaultCenter().addObserverForName(NSUserDefaultsDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
self.reload()
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这是我的问题:
主应用程序安排UILocalNotification.我打开今天的视图,看看我今天的小部件.
当通知触发时,屏幕顶部会出现一个横幅.
我在那个横幅上向下滑动以显示这两个动作,然后我选择我之前提到的那个动作(今天的小部件仍在现场和屏幕上).
我知道这个动作在后台运行正常,并且正在对信息进行更改NSUserDefaults.
但是,即使今天的窗口小部件一直处于活动状态并始终显示在屏幕上,也不会触发重新加载操作.经过进一步调查,我可以证实,NSUserDefaultsDidChangeNotification …