Изменить элементы управления блокировкой экрана во время выполнения
Мое приложение разделено на два модуля. Для первого модуля, даже после блокировки экрана, должен воспроизводиться звук, а на заблокированном экране должны отображаться детали, связанные с медиа-контентом. Однако во втором модуле особых требований нет. Звук должен быть остановлен, как только экран заблокирован, и на заблокированном экране не должно быть никаких элементов управления.
Для первого модуля я написал следующий фрагмент кода
В моем приложении я реализовал:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
MPRemoteCommandCenter *rcc = [MPRemoteCommandCenter sharedCommandCenter];
[[rcc skipForwardCommand] setEnabled:NO];
[[rcc skipBackwardCommand] setEnabled:NO];
[[rcc nextTrackCommand] setEnabled:NO];
[[rcc previousTrackCommand] setEnabled:NO];
[[rcc skipForwardCommand] setEnabled:NO];
[[rcc skipBackwardCommand] setEnabled:NO];
rcc.playCommand.enabled = YES;
rcc.pauseCommand.enabled = YES;
[[MPRemoteCommandCenter sharedCommandCenter].playCommand addTarget:self action:@selector(play)];
[[MPRemoteCommandCenter sharedCommandCenter].pauseCommand addTarget:self action:@selector(pause)];
}
- (void) play {
[[MyVideoController instance] play];
}
- (void) pause {
[[MyVideoController instance] pause];
}
в классе MyVideoController
AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:url options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
NSError *activationError = nil;
BOOL success = [[AVAudioSession sharedInstance] setActive: YES error: &activationError];
NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init];
MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: [UIImage imageNamed:@"Audio_Thumbnail_Play"]];
[songInfo setObject:title forKey:MPMediaItemPropertyTitle];
[songInfo setObject:@"duration" forKey:MPMediaItemPropertyPlaybackDuration];
[songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];
self.avPlayer = [AVPlayer playerWithPlayerItem:playerItem];
self.avPlayerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionModeDefault error: nil];
}
После блокировки экрана я вижу контроллеры, как и ожидалось. Все отлично.
Однако во втором модуле я изменил свойства аудио сеанса -
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionModeDefault error:nil];
[session setActive:NO error:nil];
}
всякий раз, когда воспроизводится видео, и я блокирую экран, я вижу изображение ниже на 1 или 2 секунды, а затем оно исчезает! Возможно, потому что приложение внезапно осознает, что экран заблокирован, а затем решает скрыть элементы управления.
Я считаю, что я не должен был видеть этот экран в первую очередь. Есть ли другой способ отключить экран кроме того, что я реализовал?
РЕДАКТИРОВАТЬ 1:
Добавлен следующий кусок в классе MyVideoController
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionModeDefault error: nil];
}
Снова, видя экран в течение 1 секунды, прежде чем он исчезнет.