相关疑难解决方法(0)

NSUserDefaultsDidChangeNotification和Today Extensions

我正在开发一个带有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)

现在,这是我的问题:

  1. 主应用程序安排UILocalNotification.我打开今天的视图,看看我今天的小部件.

  2. 当通知触发时,屏幕顶部会出现一个横幅.

  3. 我在那个横幅上向下滑动以显示这两个动作,然后我选择我之前提到的那个动作(今天的小部件仍在现场和屏幕上).

我知道这个动作在后台运行正常,并且正在对信息进行更改NSUserDefaults.

但是,即使今天的窗口小部件一直处于活动状态并始终显示在屏幕上,也不会触发重新加载操作.经过进一步调查,我可以证实,NSUserDefaultsDidChangeNotification …

nsuserdefaults ios swift ios8-today-widget today-extension

15
推荐指数
1
解决办法
5804
查看次数