iOS 获取/同步系统音量

1,547 阅读1分钟

1. 问题背景

类似Spotify或是AppleMusic,UI设计上有对应的音量调节进度条,以此为参考,我们需要实现实时监听系统物理按键的音量,并且音量进度条可以调节手机的系统音量

2. 解决方案

由于iOS15 之后AVSystemController_SystemVolumeDidChangeNotification通知不再回调,
所以我们通过MPVolumeView来获取
我们需要定义2个Slider,一个用于获取MPVolumeView的slider子视图,也用于控制系统音量
另一个Slider用来展示,以及接受控制事件.

-(UISlider *)VolumSilderForShow{
    if(!_VolumSilderForShow){
        _VolumSilderForShow = [[UISlider alloc]init];
        [_VolumSilderForShow setThumbImage:[UIImage imageNamed:@"point"] forState:UIControlStateNormal];
        _VolumSilderForShow.maximumTrackTintColor = [UIColor grayColor];
        _VolumSilderForShow.minimumTrackTintColor = [UIColor whiteColor];
        _VolumSilderForShow.maximumValue = 1;
        _VolumSilderForShow.minimumValue = 0;
        _VolumSilderForShow.value = [[AVAudioSession sharedInstance] outputVolume];
        [_VolumSilderForShow addTarget:self action:@selector(sliderValueDidChanged:) forControlEvents:UIControlEventTouchUpInside];
        [_VolumSilderForShow addTarget:self action:@selector(sliderValueDidChangedOutside:) forControlEvents:UIControlEventTouchUpOutside];
    }
    return _VolumSilderForShow;
}

-(void)sliderValueDidChanged:(HSSlider*)sender{
    self.VolumSilder.value = sender.value;
}

-(void)sliderValueDidChangedOutside:(HSSlider*)sender{
    self.VolumSilder.value = sender.value;
}

//MARK: - 手机音量变化
- (void)startListenForVolumeChanged {
     // 获取系统音量
     MPVolumeView *volumeView = [[MPVolumeView alloc] init];
     for (UIView *view in [volumeView subviews]){
        if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
             self.VolumSilder = (UISlider *)view;
             break;
         }
     }
    [self.VolumSilder addTarget:self action:@selector(silderVolumeChanged:) forControlEvents:UIControlEventValueChanged];  
}


-(void)silderVolumeChanged:(UISlider *)slider{
    float volume = slider.value;
    float adjustVolume = (floorf(volume*100 + 0.5))/100;
    [self.VolumSilderForShow setValue:adjustVolume];
}