控制 Apple Watch 的音量

Posted

技术标签:

【中文标题】控制 Apple Watch 的音量【英文标题】:Controlling volume of Apple Watch 【发布时间】:2019-10-24 10:57:55 【问题描述】:

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

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

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

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

【问题讨论】:

有什么好运的吗? 我最终将WKInterfaceVolumeControlWKInterfaceObjectRepresentable 添加到视图层次结构并将其opacity 设置为0。您必须确保音量控制保持焦点。为了确定,我添加了一个重复计时器来设置焦点。然后观察AVAudiosession.sharedInstance().observe(\.outputVolume) 并在代码中更新一个更小的视图。这行得通......在我的旧手表上,音量变化和应用程序获取音量更新之间存在相当大的差距。但我认为这是在没有大控制的情况下控制音量的唯一方法。 hi @leoMehlig 您能否分享更多详细信息和示例以及少量代码。 【参考方案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>) 
    

    使用opacity = 0VolumeView 添加到视图层次结构中。
        .background(VolumeView().opacity(0))
    收听来自系统的卷更新。
volumeObserver = AVAudioSession.sharedInstance().observe(\.outputVolume)  session, _ in
            print("Output volume: \(session.outputVolume)")
            self.volume = Double(session.outputVolume)
        

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

【讨论】:

这给了我正确的方向,谢谢!对我来说它有效,将 WKInterfaceVolumeControl 插入我的“播放器”界面控制器并将其“Alpha”设置为“0”。目前我没有发现“专注”问题。【参考方案2】:

leoMehlig's answer 仅适用于我添加一点延迟并在第一次聚焦之前退出焦点。

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

DispatchQueue.main.async 
    view.focus()

到这里:

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

【讨论】:

以上是关于控制 Apple Watch 的音量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AVplayer 中为视频文件实现音量控制?

像 VLC 应用一样通过手势(iOS 7+)控制音量

如何以编程方式更改 iOS 设备音量?

iOS:更改设备音量

在菜单栏中显示蓝牙/音量 Apple 脚本

AudioServicesPlaySystem音量控制