我正在开发一个带有Today Extension的 iPhone 应用程序。该应用程序有一个模型模块,可以从/保存到NSUserDefaults
. 由于我希望主应用程序和扩展程序都可以使用此信息,因此我使用了一个应用程序组:
let storage = NSUserDefaults(suiteName: "group.etc.etc.etc...")
应用程序和扩展程序都可以毫无问题地访问信息。
主应用程序有时可能会创建一个本地通知来呈现给用户。该通知有两个与之关联的操作 ( 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()
}
现在,在今日分机上。我自然会观察对信息所做的任何更改,NSUserDefaults
以便我可以在小部件上重新加载界面:
override func viewDidLoad() {
super.viewDidLoad()
// ...
NSNotificationCenter.defaultCenter().addObserverForName(NSUserDefaultsDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
self.reload()
}
}
现在,这是我的问题:
主应用程序安排一个 UILocalNotification。我打开今天视图并查看我的今天小部件。
当通知触发时,屏幕顶部会出现一个横幅。
我在该横幅上向下滑动以显示这两个操作,然后选择我之前提到的那个(今天的小部件仍然在屏幕上)。
我知道该操作在后台正确运行,并且正在对NSUserDefaults
.
然而,即使今天小部件一直处于活动状态并且一直显示在屏幕上,也不会触发重新加载操作。经过进一步调查,我可以确认NSUserDefaultsDidChangeNotification
没有被触发(我放置了一个断点并且它没有触发,并且还进行了一些其他检查)。
我知道通知操作正在进行更改,因为如果我强制重新加载小部件(通过关闭和打开今日视图),小部件会正确更新。
我在网上看过各种教程,他们说的第一件事就是收听这个通知并更新小部件,以便“小部件与NSUserDefaults
”同步。但问题是 AFAICT 这个通知是绝对没用的!怎么来的??
注意 1:当我从今天的小部件中更改有关 NSUserDefaults 的信息时,通知会正确触发。
注 2:调试今天的小部件绝对是可怕的,顺便说一句。在它对断点和崩溃做出反应之前,总是需要告诉 Xcode “按名称附加到进程...”。而且 iOS 不断地为小部件创建一个新进程,所以我必须不断地告诉 Xcode 再次附加。