我想检查两个音量按钮是否工作正常。因此,我设置了观察者AVSystemController_SystemVolumeDidChangeNotification
进行检查。
NotificationCenter.default.addObserver(self, selector: #selector(volumeCallback(notification:)), name: NSNotification.Name("AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
给出的是volumeCallback
方法:
@objc private func volumeCallback(notification: NSNotification) {
// check if app is in forground
guard UIApplication.shared.applicationState == .active else {
return
}
//get volume level
if let userInfo = notification.userInfo {
if let volumeChangeType = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String {
if volumeChangeType == "ExplicitVolumeChange" {
print("value changed")
let level = userInfo["AVSystemController_AudioVolumeNotificationParameter"] as? Float
guard let volLevel = level else {
return
}
// my work here
}
}
}
}
现在的问题是,第一次安装该应用程序时,我没有在volumeCallback
中获得回调。奇怪的是,当应用程序在后台运行时会调用此方法,而在前台运行时不会调用此方法。
我正在使用iPhone 5s(iOS 10.3.3)。
我不明白这段代码有什么问题。任何帮助将不胜感激。
答案 0 :(得分:1)
这很容易用键值观察器完成,因为AVAudioSession
提供了outputVolume
属性。选中here。
您可以在此属性上添加观察者并获取回调。
这是在Swift 5中执行此操作的简单方法:
// Audio session object
private let session = AVAudioSession.sharedInstance()
// Observer
private var progressObserver: NSKeyValueObservation!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
do {
try session.setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("cannot activate session")
}
progressObserver = session.observe(\.outputVolume) { [weak self] (session, value) in
print(session.outputVolume)
}
return true
}