iOS 監(jiān)聽系統(tǒng)音量變化

方式一: 簡潔版KVO監(jiān)聽outputVolume
推薦指數(shù):??????????
小小缺點: 音量加到最大或者最小的以后就不會再變化,即不會發(fā)出通知

 var obs: NSKeyValueObservation?
 func addVolumeObserver() {
        let audioSession = AVAudioSession.sharedInstance()
        do {
          //打開音頻通道,這個很重要
          //如果是連接了藍牙音響等外接設(shè)備的時候,在播放音樂狀態(tài)下,會自動同步音量,如果在不播放歌曲的情況下也需要同步音量,則打開音頻通道即可
            try audioSession.setActive(true)
            
            self.obs = audioSession.observe( \.outputVolume ,options: .new) { [weak self] (_, change) in
                let volume = change.newValue
                //音量值的范圍是0-1,如需要轉(zhuǎn)換則 (max - min)*volume 即可
                guard volume != nil else{
                    return
                }
                DLog("volume \(String(describing: volume)) \(String(describing: change.oldValue))")
                //self?._channel?.invokeMethod("audioVolumeChange", arguments:volume)
            }
        } catch  {
            
        }
    }

方式二: 常規(guī)版KVO監(jiān)聽outputVolume

  func addVolumeObserver() {
        // 綁定音量監(jiān)聽器
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setActive(true)
            
            audioSession.addObserver(self, forKeyPath: "outputVolume",options: .new,context: nil)
        } catch  {
            
        }
    }

  public override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "outputVolume"{
            guard let newKey = change?[NSKeyValueChangeKey.newKey] as? NSNumber else {
                fatalError("Could not unwrap optional content of new key")
            }

            let volume = newKey.floatValue

            print("volume " + volume.description)
        }
    }

 deinit {
        //self.obs?.invalidate()
        AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume")
    }

方式三:通知中心
該方式測試一直沒收到過數(shù)據(jù)

func addVolumeObserver() {
      // 綁定音量監(jiān)聽器
      if #available(iOS 15, *) {
          NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(_:)), name: NSNotification.Name(rawValue: "SystemVolumeDidChange"), object: nil)
      }
      else {
          NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(_:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
      }
      UIApplication.shared.beginReceivingRemoteControlEvents();
  }
  
  @objc private func volumeChanged(_ noti: NSNotification) {

      if let userInfo = noti.userInfo {
          if #available(iOS 15, *) {
              let volume = userInfo["Volume"] as? Float
              print("volume: \(String(describing: volume))")
          }
          else {
              let volume = userInfo["AVSystemController_AudioVolumeNotificationParameter"] as? Float
              print("volume: \(String(describing: volume))")
          }
      }
  }
  
  deinit {
      DLog("SwiftLotBluetoothPlugin dealloc")
      NotificationCenter.default.removeObserver(self)
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容