Swift: Detect Volume Button Press NOT volume change events
So what I'd do is subscribe to the notification like they do in the questions you linked and then add a variable named say programmaticVolumeChange. When you change the volume programmatically set the variable to true, then in your function observeValueForKeyPath, if the variable is true don't cancel the alarm (and naturally set it to false after). That way when the user presses the volume buttons you know it wasn't your code. Maybe test the amount of time between a programmatic volume change and the function call but I think that would be fine.
Eg
var programmaticVolumeChange = false
func changeVolumeProgramatically() {
programmaticVolumeChange = true
//change volume programmatically after
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject,
change: [NSObject : AnyObject], context: UnsafeMutablePointer) {
if keyPath == "outputVolume"{
if programmaticVolumeChange {
programmaticVolumeChange = false
} else {
//handle logic for user volume button press
}
}
}
program access to iPhone volume buttons
After the recent rejections from Apple
Do not use this. Apple now uses some patch which would reject your app straightaway if it uses any of the private APIs - though should note here that quite some apps on the App Store use this already and are still there!
The only way to do this now is to have an AVAudioPlayer prepared to play but not playing ([player prepareToPlay]). This seems to take care of adjusting the app's volume according to the rocker buttons.
There's no other published way currently to handle this.
PLEASE READ THE ABOVE NOTE
Yes, Use the MPVolumeView
MPVolumeView *volume = [[[MPVolumeView alloc] initWithFrame:CGRectMake(18.0, 340.0, 284.0, 23.0)] autorelease];
[[self view] addSubview:volume];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
for (UIView *view in [volume subviews]){
if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
volumeViewSlider = view; //volumeViewSlider is a UIView * object
}
}
[volumeViewSlider _updateVolumeFromAVSystemController];
-(IBAction)volumeChanged:(id)sender{
[volumeViewSlider _updateVolumeFromAVSystemController];
}
This will give you a slider (same as one used in ipod) whose value will change acc to volume of the phone
You will get a compile-time warning that view may not respond to _updateVolumeFromAVSystemControl, but just ignore it.
iOS use the volume buttons as input
See the Audio Session Services References for more details, but basically you start an audio session with AudioSessionInitialize
. Then you make it active with AudioSessionSetActive
. Then listen for changes in the volume with AudioSessionAddPropertyListener
where you can pass a callback that has type AudioSessionPropertyListener
.
Check the following website out for an example:
http://fredandrandall.com/blog/2011/11/18/taking-control-of-the-volume-buttons-on-ios-like-camera/
Related Topics
How to Play a Sound Using Swift
Developing for iOS Device in Windows Environment with Flutter
iOS 8 Sdk: Modal Uiwebview and Camera/Image Picker
Alternative to Dtsendsignalflag to Identify Key Events in Instruments
In iPhone App How to Detect the Screen Resolution of the Device
Invalid Swift Support - Files Don't Match
Uistackview Hide View Animation
How to Open File and Append a String in It, Swift
How to Define Optional Methods in Swift Protocol
Dynamic Cell Width of Uicollectionview Depending on Label Width
How to Make an Uipickerview Component Wrap Around
How to Use Avcapturephotooutput
Cleanest Way of Capturing Volume Up/Down Button Press on iOS 8
Emulating Aspect-Fit Behaviour Using Autolayout Constraints in Xcode 6
How to Resize Uiimageview Based on Uiimage's Size/Ratio in Swift 3
With Auto Layout, How to Make a Uiimageview's Size Dynamic Depending on the Image