关闭屏幕播放声音/不要让iPhone进入睡眠状态
因此,我有一个应用程序,我想让它工作,即使屏幕关闭。 以前,当我想这样做时,我使用了这个技巧-我在后台AudioServicesPlaySystemSound中循环播放一个无声/空的声音,所以如果用户按下开/关按钮,应用程序仍然在后台工作-所以它永远不允许iPhone进入睡眠模式-它只是关闭屏幕,可能还有wifi或蓝牙之类的东西在我记忆中的iPodtouch加速计上。它成功了。我想在我的新应用程序中使用相同的技巧,但当我现在测试它时,它似乎不再工作了。当我用一些声音替换空音频文件时,背景中的声音会播放,即使屏幕关闭,我也能听到它播放,但使用AVAudioPlayer应该播放的声音即使我再次打开屏幕也不会播放。 我不知道它是在什么时候停止工作的,它确实在3.x操作系统上工作。我做错什么了吗?苹果是否改变/修复了允许你的应用程序在关闭屏幕的情况下仍能工作的黑客行为?是否有其他方法可以让设备进入睡眠状态并减少电池电量,但继续工作 这是我用来播放背景/无声声音的代码:关闭屏幕播放声音/不要让iPhone进入睡眠状态,iphone,objective-c,iphone-sdk-3.0,ios,ios4,Iphone,Objective C,Iphone Sdk 3.0,Ios,Ios4,因此,我有一个应用程序,我想让它工作,即使屏幕关闭。 以前,当我想这样做时,我使用了这个技巧-我在后台AudioServicesPlaySystemSound中循环播放一个无声/空的声音,所以如果用户按下开/关按钮,应用程序仍然在后台工作-所以它永远不允许iPhone进入睡眠模式-它只是关闭屏幕,可能还有wifi或蓝牙之类的东西在我记忆中的iPodtouch加速计上。它成功了。我想在我的新应用程序中使用相同的技巧,但当我现在测试它时,它似乎不再工作了。当我用一些声音替换空音频文件时,背景中的声音
-(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:-请随意使用它,但如果你给我发一条消息,让我知道我帮了忙,那就太好了:。我不知道苹果的修复工作,但是在iOS 4中,现在可以在后台继续做你应该利用的事情。我不知道苹果的修复工作,但在iOS 4中,现在可以在后台继续做你应该利用的事情。所以答案是设置会话类别。某些类别仅在设备锁定时关闭声音。对我来说,最好的选择是音频会话类别回放
因此,答案是设置会话类别。某些类别仅在设备锁定时关闭声音。对我来说,最好的选择是音频会话类别回放
多任务处理对我的应用程序不起作用,因为它只有在iphone进入睡眠状态时才能在后台工作,而不是在应用程序关闭时,但无论如何都要感谢——我相信这会对某些人有所帮助。多任务处理对我的应用程序不起作用,因为它只有在iphone进入睡眠状态时才能在后台工作,而不是什么时候它的应用程序已关闭,但无论如何,谢谢-我相信它将帮助别人感谢你这么多!这一行代码使我的背景音频又恢复了活力。非常感谢!这一行代码使我的背景音频又恢复了活力。
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil];