Я хочу управлять некоторыми действиями в приложении с сегодняшним расширением (Widget).
Полное описание: в моем поддерживающем приложении выполняются некоторые действия (например, воспроизведение/пауза аудио). И хотите управлять этим действием и с сегодняшнего расширения (виджет). Действие также продолжает выполняться в фоновом состоянии.
В сегодняшнем расширении будет выполнено одно и то же действие. поэтому для этого, если в основном содержащем приложении уже запускается действие и отправляется в фоновое состояние, пользователь может приостановить действие из виджета. и пользователь также может запускать/приостанавливать действие в любое время из виджета (сегодняшнее расширение).
Для достижения этой цели я использовал 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()
}
уведомление не было запущено, когда пользователь обновил значение по умолчанию. он обновляет значение, когда приложение перезагружается.
как решить эту проблему?
и то же самое хочет сделать в противоположном смысле от содержания приложения к виджету. (простой пользовательский объект с одним действием, но как?)
И любой другой способ выполнить быстрое действие в приложении приложения из расширения без открытия приложения?