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