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