所以我有一个应用程序,即使屏幕关闭,我也希望它能继续运行。 以前当我想要这样做时,我使用了这个黑客/技巧 - 我在后台循环播放静音/空声(AudioServicesPlaySystemSound),所以如果用户按下开/关按钮,应用程序仍然在后台工作 - 所以它永远不会允许iPhone进入睡眠模式 - 它只是关闭屏幕,可能是wifi或蓝牙(以及据我记得的iPod Touch加速度计)。它奏效了。我想在我的新应用程序中使用相同的技巧但是当我现在测试它时它似乎不再起作用了。背景中的声音播放(当我用一些声音替换“空”音频文件时我可以听到它播放)即使屏幕关闭但它应播放的声音(使用AVAudioPlayer)也不播放(即使我转动屏幕)再次)。 我不知道它何时停止工作(肯定是在3.x操作系统上工作)。难道我做错了什么? 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 :) - 随意使用它(但如果你给我发消息会很酷,所以我知道我帮助了:) )。
答案 0 :(得分:5)
所以答案是设置会话类别。有些类别只是在设备被锁定时关闭声音。对我来说,最好的选择是AVAudioSessionCategoryPlayback
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];
答案 1 :(得分:0)
我不知道Apple修复的东西,但是在iOS 4中,现在official ways继续在后台处理你应该利用的东西。