Воспроизведение звука с выключенным экраном / не позволяйте iPhone идти спать - PullRequest
1 голос
/ 24 ноября 2010

Итак, у меня есть приложение, и я хочу, чтобы оно работало, даже если экран выключен.Ранее, когда я хотел сделать это, я использовал этот прием / трюк - я играю тихий / пустой звук в цикле в фоновом режиме (AudioServicesPlaySystemSound), поэтому, если пользователь нажимает кнопку включения / выключения, приложение все еще работает в фоновом режиме - так что оно никогдаразрешить iPhone переходить в спящий режим - он просто выключил экран и, возможно, такие вещи, как Wi-Fi или Bluetooth (и на акселерометрах iPod Touch, насколько я помню).И это сработало.Я хотел использовать тот же трюк в моем новом приложении, но когда я тестировал его сейчас, кажется, что он больше не работает.Звук в фоновом режиме воспроизводится (когда я заменяю «пустой» аудиофайл на звук, который я слышу, он воспроизводится) даже при выключенном экране, но звук, который он должен воспроизводить (используя AVAudioPlayer), не воспроизводится (даже когда я поворачиваю экранснова)Я не знаю, в какой момент он перестал работать (это точно работало на 3.x OS).Я делаю что-то неправильно?Apple изменила / исправила «хак», который позволял вашему приложению работать даже с выключенным экраном?Есть ли другой способ разрешить устройству переходить в спящий режим (и меньше разряжать батарею), но продолжать работать?

Этот код я использую для воспроизведения фонового / тихого звука:

-(void) playSilentSound
{ 
 CFBundleRef mainBundle = CFBundleGetMainBundle ();
 CFURLRef silentUrl = CFBundleCopyResourceURL (mainBundle, CFSTR ("silence"), CFSTR ("aiff"), NULL);
 AudioServicesCreateSystemSoundID (silentUrl, &silentSound);
 silentTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 target: self selector:@selector(playSilence) userInfo: nil repeats: YES];
}

-(void) playSilence
{
 AudioServicesPlaySystemSound (silentSound);
}

И вот как я играю звук, который должен воспроизводиться, даже если экран выключен:

-(BOOL) playSound: (NSString *) path withLoops: (BOOL) loops stopAfter: (int) seconds
{
 NSError *error;
 player = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: &error];
 player.delegate = self;
 player.numberOfLoops = 0;
 player.volume = volume;
 secondsPlayed = 0;
 loop = loops;
 BOOL played = [player play];

 if(played && seconds > 0)
 {
  timer = [[NSTimer scheduledTimerWithTimeInterval: 0.5 target: self selector: @selector(stopPlaying:) userInfo: [NSNumber numberWithInt: seconds] repeats: YES] retain];
  secondsLimit = seconds;
 } else {
  secondsLimit = -1;
 }
}

-(void) stopPlaying:(NSTimer*)theTimer
{
 if(secondsLimit > 0 && (secondsPlayed + [player currentTime]) >= secondsLimit)
 {
  [player stop];
  [timer release];
  timer = nil;
 }
}

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)sender successfully:(BOOL)flag
{
 if(sender == player)
 {
  if(flag) { secondsPlayed += sender.duration; }
  if(loop) { [player play]; }
 }
}

Код немного сложнее, может быть - это могут быть только первые несколько строк - он сделан так, чтотаким образом, вы можете воспроизводить только X секунд звука (если звук короче X, он будет воспроизводить несколько циклов, пока общее время не станет> = X).И, конечно, все работает нормально, когда экран оставлен включенным.

Также - если вы найдете код полезным в ваших проектах (например, playSound: withLoops: stopAfter :) - не стесняйтесь его использовать (но это будетбудь крут, если ты отправишь мне сообщение, чтобы я знал, что я помог:)).

Ответы [ 2 ]

5 голосов
/ 09 декабря 2010

Таким образом, ответ - установить категорию сеанса.Некоторые категории просто отключают звук, когда устройство заблокировано.Для меня лучший вариант был AVAudioSessionCategoryPlayback

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
0 голосов
/ 24 ноября 2010

Я не знаю о том, что Apple исправляет, но в iOS 4 теперь есть официальные способы продолжать делать вещи в фоновом режиме, которыми вы должны воспользоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...