ios ios7 volume mpmusicplayercontroller

iOS 7: volumen de MPMusicPlayerController en desuso. ¿Cómo cambiar el volumen del dispositivo ahora?



ios7 (8)

MPMusicPlayerController setVolume está en desuso desde iOS 7

¿Hay alguna otra forma de cambiar el volumen de música del sistema? Preferiblemente sin interacción del usuario. Su característica importante: aumentar el volumen automáticamente para cualquier reloj de alarma de AppStore.


@Hurden, escribí un código Swift para implementar MPVolumeSlider:

for view in mpVolumeView.subviews { let uiview: UIView = view as UIView //println("/(uiview.description)") if uiview.description.rangesOfString("MPVolumeSlider").first != nil { mpVolumeSilder = (uiview as UISlider) currentDeviceVolume = mpVolumeSilder!.value return } }

La cadena de extensión func rangeOfString se puede encontrar aquí Swift: un método Swift puro para devolver rangos de una instancia de String (Xcode 6 Beta 5)

Y use este código para permitir que el gesto y el mpvolumeslider funcionen juntos

@IBAction func handlePan(recognizer: UIPanGestureRecognizer) { let translation = recognizer.translationInView(self.view) let dx = (translation.x-lastTranslationX) let volumeChanged = Float(dx / mpVolumeView.frame.width) currentDeviceVolume = currentDeviceVolume + Float(volumeChanged) if currentDeviceVolume > 1 { currentDeviceVolume = 1 } else if currentDeviceVolume < 0 { currentDeviceVolume = 0 } mpVolumeSilder!.value = currentDeviceVolume if recognizer.state == .Changed { lastTranslationX = translation.x } if recognizer.state == .Ended || recognizer.state == .Began { lastTranslationX = 0 } }


Aparentemente hay una manera de cambiar el volumen del sistema sin mostrar nada en absoluto .

Y lo mejor de todo es que funciona en iOS 11 .

Así es como lo he logrado:

1) Crea dos variables en ViewController deseado

let volumeView = MPVolumeView() var slider: UISlider?

2) Agregue el código a continuación en su viewDidLoad

volumeView.alpha = 0.01 self.view.addSubview(volumeView) if let view = volumeView.subviews.first as? UISlider { slider = view }

3) Cambie el volumen cada vez que necesite

slider?.value = 0.4


Esta solución se pone un poco nerviosa y creo que es un poco extraño que no exista una API oficial, pero aquí está mi solución Swift creada a partir de la publicación de ambientlight

var _volumeView = MPVolumeView() var _volumeSlider : UISlider? = nil self.view.addSubview(_volumeView) _volumeView.hidden = true var i = 0 while i < _volumeView.subviews.count { if let _r = _volumeView.subviews[i] as? UISlider { _volumeSlider = _r break } ++i }


Hasta que Apple considere oportuno rescindir esta decisión, hay dos remedios que descubrí:

  • Sigue usando la propiedad de volumen, todavía funciona en iOS 7.0.2
  • Use AVAudioSession.outputVolume para leer el volumen cuando se despierta su aplicación y mostrar una alerta que contenga un MPVolumeView si el volumen es inferior (o superior a) un valor especificado por el usuario. Al menos, su usuario sabe que su alarma (o lo que sea) se reproducirá en silencio y tendrá la oportunidad de ajustar el volumen. Alternativamente, podría mostrar muy claramente el nivel de volumen para que no se sorprendan.

Para responder a su pregunta exactamente: Sí, hay otra manera de cambiar el volumen del sistema sin interacción del usuario.

Hasta hace poco solía pensar que cambiar el volumen usando MPVolumeView mediante programación solo es posible usando API privada . Pero acabo de verificar que funciona el cambio del valor de VolumeSlider y del evento touchUP del control deslizante falso.

MPVolumeView* volumeView = [[MPVolumeView alloc] init]; //find the volumeSlider UISlider* volumeViewSlider = nil; for (UIView *view in [volumeView subviews]){ if ([view.class.description isEqualToString:@"MPVolumeSlider"]){ volumeViewSlider = (UISlider*)view; break; } } [volumeViewSlider setValue:1.0f animated:YES]; [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];

(Cuando el control deslizante recibe el evento touchUP, invocará el método _commitVolumeChange en sí mismo, lo que cambiará el volumen del sistema)


Solo haz esto:

let masterVolumeSlider: MPVolumeView = MPVolumeView() if let view = masterVolumeSlider.subviews.first as? UISlider{ view.value = 1.0 }


Versión Swift:

// Outlet added in Storyboard (Add UIView then set class to MPVolumeView) @IBOutlet weak var mpVolumeView: MPVolumeView! // Get volume slider within MPVolumeView for subview in self.mpVolumeView.subviews { if (subview as UIView).description.rangeOfString("MPVolumeSlider") != nil { // Set volume let volumeSlider = subview as UISlider volumeSlider.value = 1 // Works with or without the following line: // volumeSlider.sendActionsForControlEvents(UIControlEvents.TouchUpInside) break } }


let masterVolumeSlider : MPVolumeView = MPVolumeView() if let view = masterVolumeSlider.subviews.first as? UISlider{ view.value = fVolume! view.sendActionsForControlEvents(UIControlEvents.TouchUpInside) }