【发布时间】:2016-12-28 15:44:28
【问题描述】:
我想管理一些包含今日扩展(小部件)中的应用程序的操作。
完整说明: 在我的包含应用程序中,执行了一些操作(如播放/暂停音频)。并希望从今天的扩展(小部件)中管理该操作。一个动作也会在后台状态下继续执行。
在今天的扩展中,将执行相同的操作。因此,如果在主包含的应用程序中已经启动了一个动作并将其发送到后台状态,用户可以暂停一个小部件的动作。并且用户还可以随时从小部件开始/暂停操作(今天的扩展)。
为了实现这个目标,我使用了带有应用组功能的 UserDefault 并存储了一个布尔值。当小部件出现时,它会检查布尔值并设置按钮状态播放/暂停。它设置正确,但是当我按下扩展按钮时,主机应用程序中没有执行操作。
代码:
在包含应用程序代码的主目录中
override func viewDidLoad() {
super.viewDidLoad()
let objUserDefault = UserDefaults(suiteName:"group.test.TodayExtensionSharingDefaults")
let objTemp = objUserDefault?.object(forKey: "value")
self.btnValue.isSelected = objTemp
NotificationCenter.default.addObserver(self, selector: #selector(self.userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil)
}
func userDefaultsDidChange(_ notification: Notification) {
let objUserDefault = UserDefaults(suiteName: "group.test.TodayExtensionSharingDefaults")
objUserDefault?.synchronize()
let objTemp = objUserDefault?.object(forKey: "value")
self.btnValue.isSelected = objTemp
}
在扩展类中:
@IBAction func onPlayPause(_ sender: UIButton) {
DispatchQueue.main.async {
let sharedDefaults = UserDefaults(suiteName: "group.test.TodayExtensionSharingDefaults")
if let isPlaying = sharedDefaults?.bool(forKey: "isPlaing") {
sharedDefaults?.set(!isPlaying, forKey: "isPlaying")
}else{
sharedDefaults?.set(false, forKey: "isPlaying")
}
sharedDefaults?.synchronize()
}
用户更新默认值时未触发通知。当应用重新启动时,它是更新的值。
那么如何解决这个问题呢?
同样的事情想要以相反的方式从包含应用程序到小部件。 (易于用户使用单个操作对象,但如何操作?)
还有其他方法可以在不打开应用程序的情况下从扩展程序中包含应用程序执行快速操作吗?
【问题讨论】:
-
你在哪里触发你的通知?
标签: ios swift swift3 today-extension