今日の拡張機能(ウィジェット)からアプリを含む際に何らかのアクションを管理したい。今日の拡張機能(ウィジェット)からホストアプリケーションでアクションを実行するアプリケーションを開くことなし
詳細: 私の含むアプリでは、何らかのアクション(再生/一時停止オーディオなど)が実行されます。また、今日の拡張機能(ウィジェット)からもそのアクションを管理したいと考えています。アクションはバックグラウンド状態でも引き続き実行されます。
今日の拡張では、同じ動作が実行されます。そのため、メインのアプリケーションが既にアクションを開始し、それをバックグラウンド状態にすると、ユーザーはウィジェットからアクションを一時停止できます。ユーザーはいつでもウィジェット(今日の拡張機能)からアクションを開始/一時停止することができます。
私はこの目標を達成するために、Appのグループ機能を持つUserDefaultを使用し、1つのブール値を保存しました。ウィジェットが存在するときブール値をチェックし、ボタン状態の再生/一時停止を設定します。それは正しく設定されていますが、拡張ボタンを押すと、ホストアプリケーションではアクションが実行されません。
コード:拡張クラスで
メイン含むアプリのコードで
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()
}
通知が発射されませんでした。アプリが再起動したときに更新された値です。
どのようにこの問題を解決するには?
と同じことが、アプリをウィジェットに格納することとは逆の意味でしたいと考えています。 (簡単なユーザアクションオブジェクトです)
また、アプリケーションを開かずに拡張機能からアプリケーションを含む際に、すばやいアクションを実行する方法はありますか?
? – karthikeyan