gpt4 book ai didi

ios - 从今日扩展(小部件)在主机应用程序中执行操作,无需打开应用程序 ios

转载 作者:IT王子 更新时间:2023-10-29 05:15:59 24 4
gpt4 key购买 nike

我想管理一些包含今天扩展(小部件)的应用程序的操作。

完整描述:在我包含的应用程序中,执行某些操作(如播放/暂停音频)。并希望从今天的扩展(小部件)开始管理该操作。一个 Action 也在后台状态下继续执行。

在今天的扩展中,将执行相同的操作。因此,如果在主应用程序中已经开始一个 Action 并将其发送到后台状态,用户可以从一个小部件暂停 Action 。并且用户还可以随时从小部件(今天的扩展)开始/暂停操作。

为了实现这一目标,我使用了具有应用组功能的 UserDefault 并存储了一个 bool 值。当小部件出现时,它会检查 bool 值并设置按钮状态播放/暂停。它设置正确,但是当我按下扩展按钮时,主机应用程序中没有执行操作。

代码:

在主要包含应用程序代码

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()
}

当用户更新默认值时,不会触发通知。当应用程序重新启动时它的更新值。

那么如何解决这个问题呢?

同样的事情想以相反的方式做,从包含应用程序到小部件。(易于用户单一操作对象,但如何?)

有没有其他方法可以在不打开应用程序的情况下快速执行包含扩展程序中的应用程序的操作?

最佳答案

使用MMWormhole (或其新的非官方 Swift 版本,即 Wormhole )。非常简单。

在应用的 View Controller 中:

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let wormhole = MMWormhole(applicationGroupIdentifier: "group.test.TodayExtensionSharingDefaults",
optionalDirectory: "TodayExtensionSharingDefaults")

wormhole.listenForMessage(withIdentifier: "togglePlayPause") { [weak self] _ in
guard let controller = self else { return }
controller.btnValue.isSelected = controller.btnValue.isSelected
}
}

在扩展中:

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view from its nib.

self.wormhole = MMWormhole(applicationGroupIdentifier: "group.test.TodayExtensionSharingDefaults", optionalDirectory: "TodayExtensionSharingDefaults")
}

@IBAction func onPlayPause(_ sender: UIButton) {
guard let wormhole = self.wormhole else { extensionContext?.openURL(NSURL(string: "foo://startPlaying")!, completionHandler: nil) } // Throw error here instead of return, since somehow this function was called before viewDidLoad (or something else went horribly wrong)

wormhole.passMessageObject(nil, identifier: "togglePlayPause")
}

在 Xcode 的文档类型部分的 URL 下声明 foo://(或您使用的任何其他内容),然后实现 application(_:open:options:)在您的 AppDelegate 中,以便应用在传递的 URL 为 foo://startPlaying 时开始播放音乐。

how to add URL to Xcode

关于ios - 从今日扩展(小部件)在主机应用程序中执行操作,无需打开应用程序 ios,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com