Почему звуковые элементы Lock Screen исчезают, когда я приостанавливаю AVAudioPlayer?

Я использую экземпляр AVAudioPlayer для воспроизведения аудиофайла. Приложение настроено на воспроизведение аудио в фоновом режиме, и настроен соответствующий сеанс аудио. Я также успешно получаю события дистанционного управления.

Здесь код:

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

@property (nonatomic) AVAudioPlayer *player;

@end

@implementation ViewController

@synthesize player;

- (BOOL)canBecomeFirstResponder { return YES; }

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Turn on remote control event delivery

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    // Set ourselves as the first responder

    [self becomeFirstResponder];

    // Set the audio session

    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *setCategoryError = nil;
    BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
    NSError *activationError = nil;
    success = [audioSession setActive:YES error:&activationError];

    // Play an mp3 with AVAudioPlayer

    NSString *audioFileName = @"%@/Via_Aurora.mp3";
    NSURL *audioURL = [NSURL fileURLWithPath:[NSString stringWithFormat:audioFileName, [[NSBundle mainBundle] resourcePath]]];
    player = [[AVPlayer alloc] initWithURL:audioURL];

    [player play];
}

- (void)viewWillDisappear:(BOOL)animated {

    // Turn off remote control event delivery & Resign as first responder

    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];

    // Don't forget to call super

    [super viewWillDisappear:animated];
}

- (void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent {

    if (receivedEvent.type == UIEventTypeRemoteControl) {

        switch (receivedEvent.subtype) {

            case UIEventSubtypeRemoteControlPreviousTrack:
                NSLog(@"prev");
                break;

            case UIEventSubtypeRemoteControlNextTrack:
                NSLog(@"next");
                break;

            case UIEventSubtypeRemoteControlPlay:
                [player play];
                break;

            case UIEventSubtypeRemoteControlPause:
                [player pause];
                break;

            default:
                break;
        }
    }
}

@end

Когда я запускаю приложение, звук воспроизводится при загрузке представления. Приложение продолжает воспроизводить аудио, когда оно переходит в фоновый режим. Я могу успешно приостановить и/или воспроизвести аудио из Центра управления (доступ к которому можно получить либо из приложения, либо из экрана блокировки), но, если я получаю доступ к элементам управления блокировкой экрана и приостанавливаю плеер, музыка приостанавливается и блокируется экран блокировки исчезают. Я ожидаю, что музыка остановится, но не для того, чтобы элементы управления исчезли.

В других аудио-приложениях, которые я использую, вы можете приостановить, затем воспроизвести аудио с экрана блокировки. Я что-то упустил? Это правильный подход, чтобы сделать что-то вроде этого?

Ответы

Ответ 1

Вы на правильном пути...

Кажется, у вас отсутствует настройка;

  MPNowPlayingInfoCenter nowPlayingInfo

Без этого вы получите описанные результаты, IE после нажатия паузы, экран блокировки больше не показывает паузу, или действительно, что он воспроизводит песню. Вот руководство по его установке (я взял это из рабочего кода, который я сделал некоторое время назад, но я уверен, что вы можете понять, что именно).

    MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc]initWithImage:albumImage];
    [MPNowPlayingInfoCenter defaultCenter].nowPlayingInfo = [NSDictionary dictionaryWithObjectsAndKeys:aSong.songTitle, MPMediaItemPropertyTitle,
                                                             aSong.artistName, MPMediaItemPropertyArtist, artwork, MPMediaItemPropertyArtwork,  1.0f, MPNowPlayingInfoPropertyPlaybackRate, nil];

Ответ 2

Добавьте этот код в ViewDidLoad() Для воспроизведения в фоновом режиме. Это работает для меня. Вы должны попробовать его

    UIApplication.sharedApplication().beginReceivingRemoteControlEvents()

    let session:AVAudioSession = AVAudioSession.sharedInstance()

    do
    {
        try session.setCategory(AVAudioSessionCategoryPlayback)
    }
    catch
    {
        print("Background Play Error")
    }