始めに
有線のイヤホンやairpodsなどが端末と接続されオーディオの出力先が変更したとき、これを検知することができますが、少し躓いたので書き留めておきます。
本題
import SwiftUI
import AVFoundation
class AudioSessionManager: ObservableObject {
@Published var headphonesConnected: Bool = false
init() {
do {
try AVAudioSession.sharedInstance().setActive(true) // この処理がなくて躓いた
print("AVAudioSession is now active")
} catch {
print("Failed to activate AVAudioSession. Error: \(error)")
}
let nc = NotificationCenter.default
nc.addObserver(
self,
selector: #selector(handleRouteChange(_:)),
name: AVAudioSession.routeChangeNotification,
object: nil
)
}
@objc func handleRouteChange(_ notification: Notification) {
print("Route Change")
guard let userInfo = notification.userInfo,
let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
let reason = AVAudioSession.RouteChangeReason(rawValue: reasonValue) else {
return
}
switch reason {
case .newDeviceAvailable:
headphonesConnected = true
if headphonesConnected {
print("イヤホンが接続されました。")
}
case .oldDeviceUnavailable:
headphonesConnected = false
if !headphonesConnected {
print("イヤホンが解除されました。")
}
default: break
}
}
}
struct ContentView: View {
@ObservedObject var audioSessionManager = AudioSessionManager()
var body: some View {
VStack {
Text(audioSessionManager.headphonesConnected ? "イヤホンが接続されています。" : "イヤホンが接続されていません。")
}
}
}
終わりに
これでオーディオの出力先が変更された場合に検知することができます。
参考文献