MPMusicPlayerController setVolume est obsolète depuis iOS 7
Existe-t-il un autre moyen de modifier le volume de la musique système? De préférence sans interaction de l'utilisateur .. Sa principale caractéristique est d'augmenter le volume automatiquement pour tout réveil de l'AppStore.
Pour répondre exactement à votre question: Oui, il existe un autre moyen de modifier le volume du système sans interaction de l'utilisateur.
Jusqu'à récemment, je pensais qu'il était possible de modifier le volume à l'aide de MPVolumeView par programmation uniquement à l'aide de private API . Mais je viens de vérifier que la modification de la valeur de volumeSlider et de l'événement touchUP du curseur simulé fonctionnent:
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];
(Lorsque le curseur reçoit un événement touchUP, il invoquera la méthode _commitVolumeChange
sur lui-même, ce qui modifiera le volume du système.)
Jusqu'à ce qu'Apple juge opportun d'annuler cette décision, j'ai découvert deux solutions:
Faites juste ceci:
let masterVolumeSlider: MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = 1.0
}
@Hurden, j'ai écrit un code Swift pour implémenter 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
}
}
L'extension String func rangeOfString est disponible ici Swift: une méthode purement Swift pour renvoyer des plages d'une instance String (Xcode 6 Beta 5)
Et utilisez ce code pour que le geste et mpvolumeslider fonctionnent ensemble
@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
}
}
Version rapide:
// 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
}
}
Apparemment, il y a est un moyen de changer le volume du système sans rien afficher .
Et le meilleur de tout cela fonctionne sur iOS 11 .
Voici comment je l'ai réalisé:
1) Créez deux variables dans le ViewController souhaité
let volumeView = MPVolumeView()
var slider: UISlider?
2) Ajoutez le code ci-dessous dans votre viewDidLoad
volumeView.alpha = 0.01
self.view.addSubview(volumeView)
if let view = volumeView.subviews.first as? UISlider {
slider = view
}
3) Changez de volue quand vous en avez besoin
slider?.value = 0.4
let masterVolumeSlider : MPVolumeView = MPVolumeView()
if let view = masterVolumeSlider.subviews.first as? UISlider{
view.value = fVolume!
view.sendActionsForControlEvents(UIControlEvents.TouchUpInside)
}
Cette solution rend un peu nerveuse et je pense que c'est un peu étrange qu'une API officielle n'existe pas, mais voici ma solution Swift basée sur le message 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
}