Detectar el button de volumen del iPhone hacia arriba Presione?

¿Hay alguna notificación que pueda escuchar que me avise cuando aparezca el volumen de un iPhone?

Sé acerca de AVSystemController_SystemVolumeDidChangeNotification , pero es esencial que la notificación solo se active cuando el volumen se ha subido, no hacia arriba o hacia abajo.

En segundo lugar, ¿cómo puedo ocultar la vista translúcida que aparece cuando se presiona el button de upload volumen, mostrando el volumen del sistema? Camera + ha implementado esto.

No hay forma documentada de esto, pero puede usar esta solución. Regístrese para la notificación AVSystemController_SystemVolumeDidChangeNotification y agregue un MPVolumeView que MPVolumeView que se MPVolumeView la vista del volumen del sistema.

 MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-100, 0, 10, 0)]; [volumeView sizeToFit]; [self.view addSubview:volumeView]; 

Y no te olvides de iniciar una session de audio

 AudioSessionInitialize(NULL, NULL, NULL, NULL); AudioSessionSetActive(true); 

En este caso, el MPVolumeView está oculto al usuario.

En cuanto a verificar si se presionó el volumen hacia arriba o hacia abajo, simplemente tome el volumen de la aplicación actual

 float volumeLevel = [[MPMusicPlayerController applicationMusicPlayer] volume]; 

y compárelo con el nuevo volumen después de presionar el button en la callback de notificación

Si no quieres hacerlo solo, hay una class drop-in disponible en github

https://github.com/blladnar/RBVolumeButtons

Si desea un evento, puede registrar un oyente en la propiedad "outputVolume":

 - (void)viewWillAppear:(BOOL)animated { AVAudioSession* audioSession = [AVAudioSession shanetworkingInstance]; [audioSession setActive:YES error:nil]; [audioSession addObserver:self forKeyPath:@"outputVolume" options:0 context:nil]; } -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqual:@"outputVolume"]) { NSLog(@"volume changed!"); } } 

Solucioné este problema agregando el objective / acción propia para UISlider colocado dentro de MPVolumeView . Por lo tanto, es posible capturar events de cambio de volumen y determinar qué button se presionó. Aquí hay un repository de github con la implementación de este enfoque. Funciona bien con iOS 7 y versiones posteriores, sin advertencias de desaprobación y sin rechazo de Apple.

Para distinguir la acción de volumen: EN LUGAR DE (en observe Guardia de valor)

 temp != 0.5 

USE solo para upload de volumen

 temp > 0.5 

y solo detecta el volumen hacia abajo:

 temp < 0.5 

Esta solución a continuación se imprimirá si se pulsa el volumen hacia arriba o hacia abajo.

 import AVFoundation import MediaPlayer override func viewDidLoad() { super.viewDidLoad() let volumeView = MPVolumeView(frame: CGRect.zero) for subview in volumeView.subviews { if let button = subview as? UIButton { button.setImage(nil, for: .normal) button.isEnabled = false button.sizeToFit() } } UIApplication.shanetworking.windows.first?.addSubview(volumeView) UIApplication.shanetworking.windows.first?.sendSubview(toBack: volumeView) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) AVAudioSession.shanetworkingInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) do { try AVAudioSession.shanetworkingInstance().setActive(true) } catch { debugPrint("\(error)") } } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) AVAudioSession.shanetworkingInstance().removeObserver(self, forKeyPath: "outputVolume") do { try AVAudioSession.shanetworkingInstance().setActive(false) } catch { debugPrint("\(error)") } } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { guard let key = keyPath else { return } switch key { case "outputVolume": guard let dict = change, let temp = dict[NSKeyValueChangeKey.newKey] as? Float, temp != 0.5 else { return } let systemSlider = MPVolumeView().subviews.first { (aView) -> Bool in return NSStringFromClass(aView.classForCoder) == "MPVolumeSlider" ? true : false } as? UISlider systemSlider?.setValue(0.5, animated: false) guard systemSlider != nil else { return } debugPrint("Either volume button tapped.") default: break } }