【问题标题】:volume button notification iPhone音量键通知 iPhone
【发布时间】:2014-10-31 08:35:50
【问题描述】:

我试图在按下音量按钮(手机左侧的按钮)时收到通知。我用谷歌搜索了很多,似乎我应该使用 mediaPlayer,但由于我是 iOS 新手,而 Swift 无法让它运行。这是我的工作:

import UIKit
import MediaPlayer
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var mediaPlayer: MPMusicPlayerController = MPMusicPlayerController()

        NSNotificationCenter.defaultCenter().addObserver(mediaPlayer,
            selector: "volumeIsChanged:",
            name: MPMusicPlayerControllerVolumeDidChangeNotification,
            object: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func volumeIsChanged(notification: NSNotification){
        println("Volume Is Changed")
    }
}

PS:我知道,苹果不希望改变 iPhone 硬件的行为。

【问题讨论】:

  • 你能找到解决办法吗?

标签: ios iphone swift hardware


【解决方案1】:

试试这个:

func hookVolume() {
    var volumeView = MPVolumeView(frame: CGRectMake(-500, -500, 0, 0)) 
    self.window?.addSubview(volumeView)

    NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "volumeChanged:",
        name: "AVSystemController_SystemVolumeDidChangeNotification",
        object: nil)

}

func volumeChanged(notification: NSNotification) {
    let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float        
}

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    hookVolume()
}

【讨论】:

    【解决方案2】:

    对于 Swift 4,更新后的代码应如下所示。也不要忘记删除观察者 - 总是

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // slider to visualize the volume change
        var volumeView = UISlider(frame: CGRect(x:0,y:0,width:300,height:50))
        volumeView.tag = 100
        self.view.addSubview(volumeView)
    
        //Add observer for the volume change event
        NotificationCenter.default.addObserver(self, selector: #selector(NowPlayingViewController.volumeChanged(_:)), name: NSNotification.Name("AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
    }
    
    @objc func volumeChanged(notification: NSNotification) {
        let volume = notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Float
        print("Volume value:\(volume)")
    
        //Get the slider by its tag
        let volumeView = self.view.viewWithTag(100) as! UISlider
        //Update the slider value to correspond to the volume
        volumeView.value = volume
    }
    
    deinit {
        // Don't forget to remove the observer
        NotificationCenter.default.removeObserver(self,
                                                  name: Notification.Name("AVSystemController_SystemVolumeDidChangeNotification"),
                                                  object: nil)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-13
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多