I'm trying to control the volume of the Apple Watch itself in code from SwiftUI.
I'm streaming audio using the AVPlayer
.
Is there an API to set the Volume of the Watch or use to Digital Crown to control the volume without
volume
property on the AVPlayer
. This just set the volume relative to the system volume. So if the system is muted it does not increase the volume.WKInterfaceVolumeControl
. This does the job, but it can not be sized does and takes a lot of space on the small screen.The workaround I ended up with was this:
WKInterfaceVolumeControl
to use it in SwiftUIstruct 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>) {
}
}
VolumeView
to the view hierarchy with opacity = 0
. .background(VolumeView().opacity(0))
volumeObserver = AVAudioSession.sharedInstance().observe(\.outputVolume) { session, _ in
print("Output volume: \(session.outputVolume)")
self.volume = Double(session.outputVolume)
}
With that you can update some other view, but keep in mind that especially on older what's the update does not always happen (immediately).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With