AVSystemController_SystemVolumeDidChangeNotification首次不提供回调

时间:2019-07-25 07:25:12

标签: ios swift swift4 avaudioplayer avsystemcontroller

我想检查两个音量按钮是否工作正常。因此,我设置了观察者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)。

我不明白这段代码有什么问题。任何帮助将不胜感激。

1 个答案:

答案 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
}