MPVolumeSlider's MPVolumeControllerSystemDataSource недоступен в iOS 11.4 - PullRequest
0 голосов
/ 30 мая 2018

Сегодня я обновил iOS до последней версии 11.4.Для настройки громкости системы я использую следующий метод:

-(void) setVolumeLevel:(float)val {
    MPVolumeView *slide = [MPVolumeView new];
    UISlider *volumeViewSlider;

    for (UIView *view in [slide subviews]){
        if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
            volumeViewSlider = (UISlider *) view;
        }
    }
    volumeViewSlider.value=val;
}

Но с 11.4 громкость не устанавливается.Ниже находится журнал, когда я печатаю.Подскажите пожалуйста, как настроить громкость системы под iOS 11.4

<MPVolumeSlider: 0x1075bc3f0 dataSource: <MPVolumeControllerSystemDataSource: 0x1075be160 not available>

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Я столкнулся с той же проблемой и решил ее, добавив новый MPVolumeView в мое представление UIViewController, иначе он больше не устанавливал громкость.Когда я добавил его в контроллер, мне также нужно установить положение просмотра громкости за пределами экрана.

Я использую здесь метод setMaxVolume, и он работает в любое время, независимо от того, воспроизводили ли вы звук раньше или нет.

Код указан в Swift 4:

let volumeControl = MPVolumeView(frame: CGRect(x: 0, y: 0, width: 120, height: 120))

override func viewDidLoad() {
   self.view.addSubview(volumeControl);
}

override func viewDidLayoutSubviews() {
   volumeControl.frame = CGRect(x: -120, y: -120, width: 100, height: 100);
}

func setMaxVolume() {
    let lst = volumeControl.subviews.filter{NSStringFromClass($0.classForCoder) == "MPVolumeSlider"}
    let slider = lst.first as? UISlider

    slider?.setValue(1, animated: false)
}
0 голосов
/ 28 июня 2018

Следующий код решает проблему

#pragma mark - GetVolume 
- (float)getCurrentVolume {
if (SystemVersion >= 7) {
    if (_volumeViewSlider) {
        return _volumeViewSlider.value;
    }
    MPVolumeView *volumeView = [[MPVolumeView alloc] init];
    for (UIView *view in [volumeView subviews]){
        if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
            _volumeViewSlider = (UISlider*)view;
            break;
        }
    }
    return _volumeViewSlider.value;
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    // 过期api写在这里不会有警告
    return [[MPMusicPlayerController applicationMusicPlayer] volume];
#pragma clang diagnostic pop
    }
}

#pragma mark - SetVolume
- (void)setVolume:(float)newVolume {
    newVolume = newVolume > 1 ? 1 : newVolume;
    newVolume = newVolume < 0 ? 0 : newVolume;

    if (SystemVersion >= 7) {
        [self.volumeViewSlider setValue:newVolume animated:NO];
    } else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        [[MPMusicPlayerController applicationMusicPlayer]                 setVolume:newVolume];
#pragma clang diagnostic pop
    }
}

Fisrt Addview UISlider * на ваш взгляд.затем getVolume и setVolume。

0 голосов
/ 04 июня 2018

Попробуйте настроить громкость для volumeViewSlider после запуска любого аудио, каким-то образом установка аудиосессии на активную не помогает настроить громкость с помощью ползунка MPVolume, как только звук запускается (с использованием AVAudioPlayer в моем случае), тот же код работает.

Так что в принципе, в моем случае, после запуска контроллера представления прямое изменение громкости с помощью ползунка не работает, в то время как после запуска любого звука с использованием AVAudioPlayer в контроллере представления ползунок работает нормально.

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    audioPlayer.numberOfLoops = -1;
    audioPlayer.volume = 1.0;

    [audioPlayer play];

    if ([[MyGlobalManager sharedManager] getDeviceOS] > 11.3 && [[AVAudioSession sharedInstance] outputVolume] != 1.0f){
        [volumeViewSlider setValue:1.0f animated:YES];
        [volumeViewSlider sendActionsForControlEvents:UIControlEventTouchUpInside];
    }

Где, volumeSlider получается как:

MPVolumeView* volumeView = [[MPVolumeView alloc] init];

    //find the volumeSlider
    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];
...