AVAudioPlayer не может воспроизводить музыку с NSTimer в фоновом режиме - PullRequest
0 голосов
/ 19 октября 2011

Я хочу воспроизводить музыку с AVAudioPlayer, используя NSTimer, но [player prepareToPlay] возвращает NO и не воспроизводится в фоновом режиме.

Может кто-нибудь подсказать мне идею?

Вотмой код:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(playMusic:) userInfo:nil repeats:NO];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)playMusic:(NSTimer *)timer{
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    NSString *fileName = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Apologize.mp3"];
    NSURL *fileUrl = [NSURL fileURLWithPath:fileName];
    NSError *error;
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:fileUrl error:&error];
    if ([player prepareToPlay]) {
        [player play];
        NSLog(@"start!");
    }else{
        NSLog(@"error msg :%@",error);
    }
}

- (void)applicationDidEnterBackground:(UIApplication *)application {

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){
        [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    }

    UIBackgroundTaskIdentifier backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    //        /* just fail if this happens. */
        [[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
    }];
}

Ответы [ 3 ]

1 голос
/ 10 декабря 2014

Вы должны выполнить эту инициализацию в viewDidLoad :

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"test"
                                                          ofType:@"mp3"];
NSURL *fileURL = [[NSURL alloc] initFileURLWithPath:soundFilePath];
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL
                                                          error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];

Это для инициализации аудио.Здесь, с MP3 с именем test , импортированным в проект.Обратите внимание, что часть beginReceivingRemoteControlEvents очень важна.Без этого вы не сможете начать играть с фона, просто продолжайте слушать музыку, уже воспроизводимую с переднего плана.

Теперь вам нужно прослушать событие didEnterInBackGround (вы можете пойти с applicationDidEnterBackground вашего делегата приложения, но таким образом вы можете поместить код в класс, к которому он принадлежит):

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(didEnterBG:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];

А теперь этот didEnterBG метод:

self.backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(backgroundWork) userInfo:nil repeats:YES];
[self.backgroundTimer fire];

Здесь я повторяю этот звук каждые 10 секунд по личным причинам, но делаю все, что вам нужно.Наконец, метод backgroundWork :

- (void)backgroundWork{
    [self.audioPlayer prepareToPlay];
    [self.audioPlayer play];
}

Теперь ваш аудиофайл воспроизводится в фоновом режиме: -)

Вы также должны отметить, что ваше приложение должно иметь определенные правапродолжать делать работу в фоновом режиме.Вам необходимо установить флажок под «YourTarget» -> «Возможности» -> «Режимы фона»: аудио и AirPlay.В противном случае ОС прекратит работу вашего приложения через несколько минут в реальных условиях (без отладчика или инструмента).

0 голосов
/ 24 октября 2011

У меня та же проблема, но я нашел решение из этого поста: http://developer.apple.com/library/ios/#qa/qa1668/_index.html

#import <AVFoundation/AVFoundation.h>
#import <AudioToolbox/AudioToolbox.h>

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

NSError *setCategoryError = nil;
[audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError];
if (setCategoryError) { /* handle the error condition */ }

NSError *activationError = nil;
[audioSession setActive:YES error:&activationError];
if (activationError) { /* handle the error condition */ }
0 голосов
/ 19 октября 2011

перед переходом к коду. Вы должны сообщить ОС, что хотите получить разрешение на воспроизведение музыки в фоновом режиме. Вы можете сделать это, установив Ключ в info.plist вашего приложения

<key>UIBackgroundModes</key>
    <array>
            <string>audio</string>
    </array>

делая это, вы сможете воспроизводить аудио, когда приложение переходит в фоновый режим.

...