【发布时间】:2010-11-24 13:49:39
【问题描述】:
所以我有一个应用程序,即使屏幕关闭,我也希望它继续工作。 以前,当我想这样做时,我使用了这个 hack/trick - 我在后台循环播放无声/空的声音(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:) - 随意使用它(但如果你给我发消息会很酷,这样我就会知道我有帮助:) )。
【问题讨论】:
标签: iphone objective-c iphone-sdk-3.0 ios ios4