1

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

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

4

1 回答 1

3

AVAudioSession这可以通过提供outputVolume属性的键值观察器轻松完成。在这里检查。

您可以在此属性上添加观察者并获取回调。

这是在 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
}
于 2019-07-26T10:30:44.150 回答