音量按钮通知iPhone

时间:2014-10-31 08:35:50

标签: ios iphone swift hardware

我正在尝试按下音量按钮(手机左侧的按钮)时收到通知。我google了很多,似乎我应该使用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硬件的行为。

2 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:0)

对于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)
}