控制 Apple Watch 的音量

Controlling volume of Apple Watch

我试图在 SwiftUI 的代码中控制 Apple Watch 本身的音量。

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

是否有 API 来设置手表的音量或使用 Digital Crown 来控制音量而没有

我最终采用的解决方法是:

  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. VolumeView 添加到具有 opacity = 0 的视图层次结构中。
        .background(VolumeView().opacity(0))
  1. 收听系统的音量更新。
volumeObserver = AVAudioSession.sharedInstance().observe(\.outputVolume) { session, _ in
            print("Output volume: \(session.outputVolume)")
            self.volume = Double(session.outputVolume)
        }

有了它,您可以更新一些其他视图,但请记住,特别是在较旧的情况下,更新并不总是(立即)发生。

只有当我在第一次聚焦之前添加一点延迟并放弃聚焦时才对我有用。

所以,在代码中,我改变了这个:

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

对此:

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