控制Apple Watch的音量

时间:2019-10-24 10:57:55

标签: watchos-6

我正在尝试通过SwiftUI的代码控制Apple Watch本身的音量。

我正在使用AVPlayer流式传输音频。

是否有用于设置手表音量的API或用于Digital Crown来控制音量而无需

  • volume上设置AVPlayer属性。这只是设置相对于系统音量的音量。因此,如果系统静音,则不会增加音量。
  • 使用WKInterfaceVolumeControl。这项工作可以完成,但是无法调整大小,并且会在小屏幕上占用大量空间。

2 个答案:

答案 0 :(得分:1)

我最终的解决方法是:

  1. 包装WKInterfaceVolumeControl以在SwiftUI中使用它
struct VolumeView: WKInterfaceObjectRepresentable {
    typealias WKInterfaceObjectType = WKInterfaceVolumeControl


    func makeWKInterfaceObject(context: Self.Context) -> WKInterfaceVolumeControl {
        let view = WKInterfaceVolumeControl(origin: .local)
        Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak view] timer in
            if let view = view {
                view.focus()
            } else {
                timer.invalidate()
            }
        }
        DispatchQueue.main.async {
            view.focus()
        }
        return view
    }
    func updateWKInterfaceObject(_ wkInterfaceObject: WKInterfaceVolumeControl, context: WKInterfaceObjectRepresentableContext<VolumeView>) {
    }
}
  1. 使用VolumeViewopacity = 0添加到视图层次结构。
        .background(VolumeView().opacity(0))
  1. 收听系统中的卷更新。
volumeObserver = AVAudioSession.sharedInstance().observe(\.outputVolume) { session, _ in
            print("Output volume: \(session.outputVolume)")
            self.volume = Double(session.outputVolume)
        }

这样您就可以更新其他视图,但是请记住,尤其是在较旧的版本中,更新并不总是(立即)发生。

答案 1 :(得分:0)

leoMehlig's answer仅对我有用,如果我添加了一些延迟并在第一次聚焦之前就将焦点移开了。

所以,用代码来说,我做了以下更改:

DispatchQueue.main.async {
    view.focus()
}

对此:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    view.resignFocus()
    view.focus()
}