2014-02-02 9 views
1

Я пишу приложение для будильника, которое работает, играя зацикливаемую тишину в фоновом режиме, пока не наступит время для срабатывания будильника, после чего он воспроизводит звуковой сигнал на петле до тех пор, пока пользователь открывает приложение. Вот мой код из applicationWillResignActive:Фоновый звук, работающий на симуляторе iOS, но не на устройстве

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask = 0; 
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
}]; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"silence" ofType:@".wav"]; 
NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; 
player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:nil]; 
[player setNumberOfLoops:-1]; 
alarmTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval target:self selector:@selector(playAlarm) userInfo:nil repeats:NO]; 
[player prepareToPlay]; 
[player play]; 

здесь метод срабатывает по таймеру:

[player stop]; 
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"Alarm" ofType:@".m4r"]; 
NSURL *soundURL = [NSURL fileURLWithPath:soundPath]; 
player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:nil]; 
[player setNumberOfLoops:-1]; 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
[player prepareToPlay]; 
[player play]; 

Это работает как задумано, когда я проверить его на тренажере. На моем iPhone метод таймера вызывает вызов, но звук не воспроизводится. Я добавил фоновый звук в свой файл plist. Чувствительность iPhone к названию аудиофайла не является проблемой, а переключатель отключения звука iPhone выключен. Спасибо за прочтение!

ответ

0

решена: по-видимому, вы не можете инициировать звук с фона. обходным способом является вызов метода, который воспроизводит звук из основного потока, используя performSelectorOnMainThread:withObject:waitUntilDone:.

+1

У вас есть пример кода, который я мог видеть? –

Смежные вопросы