控制 Apple Watch 的音量
Controlling volume of Apple Watch
我试图在 SwiftUI 的代码中控制 Apple Watch 本身的音量。
我正在使用 AVPlayer
流式传输音频。
是否有 API 来设置手表的音量或使用 Digital Crown 来控制音量而没有
- 在
AVPlayer
上设置 volume
属性。这只是设置相对于系统音量的音量。因此,如果系统静音,它不会增加音量。
- 正在使用
WKInterfaceVolumeControl
。这样可以完成工作,但无法调整大小,并且在小屏幕上需要很多 space。
我最终采用的解决方法是:
- 封装
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>) {
}
}
- 将
VolumeView
添加到具有 opacity = 0
的视图层次结构中。
.background(VolumeView().opacity(0))
- 收听系统的音量更新。
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()
}
我试图在 SwiftUI 的代码中控制 Apple Watch 本身的音量。
我正在使用 AVPlayer
流式传输音频。
是否有 API 来设置手表的音量或使用 Digital Crown 来控制音量而没有
- 在
AVPlayer
上设置volume
属性。这只是设置相对于系统音量的音量。因此,如果系统静音,它不会增加音量。 - 正在使用
WKInterfaceVolumeControl
。这样可以完成工作,但无法调整大小,并且在小屏幕上需要很多 space。
我最终采用的解决方法是:
- 封装
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>) {
}
}
- 将
VolumeView
添加到具有opacity = 0
的视图层次结构中。
.background(VolumeView().opacity(0))
- 收听系统的音量更新。
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()
}