Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭屏幕播放声音/不要让iPhone进入睡眠状态_Iphone_Objective C_Iphone Sdk 3.0_Ios_Ios4 - Fatal编程技术网

关闭屏幕播放声音/不要让iPhone进入睡眠状态

关闭屏幕播放声音/不要让iPhone进入睡眠状态,iphone,objective-c,iphone-sdk-3.0,ios,ios4,Iphone,Objective C,Iphone Sdk 3.0,Ios,Ios4,因此,我有一个应用程序,我想让它工作,即使屏幕关闭。 以前,当我想这样做时,我使用了这个技巧-我在后台AudioServicesPlaySystemSound中循环播放一个无声/空的声音,所以如果用户按下开/关按钮,应用程序仍然在后台工作-所以它永远不允许iPhone进入睡眠模式-它只是关闭屏幕,可能还有wifi或蓝牙之类的东西在我记忆中的iPodtouch加速计上。它成功了。我想在我的新应用程序中使用相同的技巧,但当我现在测试它时,它似乎不再工作了。当我用一些声音替换空音频文件时,背景中的声音

因此,我有一个应用程序,我想让它工作,即使屏幕关闭。 以前,当我想这样做时,我使用了这个技巧-我在后台AudioServicesPlaySystemSound中循环播放一个无声/空的声音,所以如果用户按下开/关按钮,应用程序仍然在后台工作-所以它永远不允许iPhone进入睡眠模式-它只是关闭屏幕,可能还有wifi或蓝牙之类的东西在我记忆中的iPodtouch加速计上。它成功了。我想在我的新应用程序中使用相同的技巧,但当我现在测试它时,它似乎不再工作了。当我用一些声音替换空音频文件时,背景中的声音会播放,即使屏幕关闭,我也能听到它播放,但使用AVAudioPlayer应该播放的声音即使我再次打开屏幕也不会播放。 我不知道它是在什么时候停止工作的,它确实在3.x操作系统上工作。我做错什么了吗?苹果是否改变/修复了允许你的应用程序在关闭屏幕的情况下仍能工作的黑客行为?是否有其他方法可以让设备进入睡眠状态并减少电池电量,但继续工作

这是我用来播放背景/无声声音的代码:

-(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];