Итак, у меня есть приложение, и я хочу, чтобы оно работало, даже если экран выключен.Ранее, когда я хотел сделать это, я использовал этот прием / трюк - я играю тихий / пустой звук в цикле в фоновом режиме (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 :) - не стесняйтесь его использовать (но это будетбудь крут, если ты отправишь мне сообщение, чтобы я знал, что я помог:)).