当蓝牙耳机连接到 Apple Watch 时,触觉不会在后台播放



我有一个watchOS3锻炼应用程序,使用触觉通知。它设置正确运行锻炼会话和触觉工作时,在后台运行。然而,如果蓝牙耳机连接到apple watch,那么你只会得到触觉振动或触觉的音频编钟,这取决于应用程序当前是显示在表盘上还是在后台运行。

我是这样玩触觉的:

WKInterfaceDevice.current().play(.notification)

详情如下:

  • Apple Watch Nike+ Unpaired to耳机:无论表盘是打开还是关闭,触觉和编钟声音都会激活。编钟声音嘹亮。

  • Apple Watch Nike+配对蓝牙耳机:触觉仅在表盘打开时激活,音频报时关闭。当表盘关闭时,音频报时打开,触觉关闭。编钟声音嘹亮。

我测试了将Apple Watch分别与Platronic Backbeat Go 2(发布于2013年7月)和Bose QuietControl 30(发布于2016年10月)配对的应用程序。结果是一样的。

有谁知道这是watchOS 3的限制,一个bug,还是我需要做的其他事情?

谢谢,杰夫

还有一个要考虑的因素,那就是Watch的主静音开关是开还是关。

我发现下面是一个合适的解决方案。

当你想要你的音频/触觉被注意到,而音乐是在蓝牙耳机上播放,有这个AVAudioSession类别设置:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)

然后,当你完成你的音频/触觉,重置AVAudioSession回:

AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)

我有这个帮助类来帮助管理状态:

import AVFoundation
enum AudioPlaybackState {
    case playback
    case playbackDuckOthers
}
class AVAudio {
    private init() {}   // strictly a helper class
    static func setAudioState(_ state: AudioPlaybackState) {
        DispatchQueue.main.async {
            do {
                deactivateAudioSession()
                switch state {
                case .playback:
                    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .mixWithOthers)
                case .playbackDuckOthers:
                    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)
                }
                activateAudioSession()
            } catch {}
        }
    }
    static func deactivateAudioSession() {
        activateAudioSession(false)
    }
    private static func activateAudioSession(_ value: Bool=true) {
        do {
            try AVAudioSession.sharedInstance().setActive(value)
        } catch {}
    }
}
然后,我可以快速切换:AVAudio.setAudioState(.playbackDuckOthers)

根据苹果公司的说法,问题中记录的行为应该是这样的。给出的原因是使用蓝牙耳机时,触觉点击和触觉音频之间的延迟。我希望这种行为在将来有所改变…

最新更新