You need to start an audio session before the notification will fire:
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionSetActive(true);
Now you can subscribe to the notification:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(volumeChanged:)
name:@"AVSystemController_SystemVolumeDidChangeNotification"
object:nil];
To get the volume:
float volume = [[[notification userInfo]
objectForKey:@"AVSystemController_AudioVolumeNotificationParameter"]
floatValue];
You will need to store the volume and compare it to the previous value you got from a notification to know which button was pressed.
This solution will still adjust the system volume when the user presses the volume key, and show the volume overlay. If you want to avoid changing the system volume and showing the overlay (in essence completely repurpose the volume keys), see this answer
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…