2010-11-24 149 views
1

因此,我有一個應用程序,即使屏幕關閉,我也想繼續工作。 以前,當我想這樣做時,我使用了這個技巧 - 我在背景(AudioServicesPlaySystemSound)循環中播放無聲/空聲音,所以如果用戶按下開/關按鈕,應用程序仍然在後臺工作 - 所以它絕不允許iPhone進入睡眠模式 - 它只是關閉了屏幕,可能是wifi或藍牙(以及iPod Touch加速度計,據我所知)。它的工作。我想在我的新應用程序中使用相同的技巧,但是當我現在測試它時,它似乎不再起作用。即使關閉了屏幕,但後臺播放的聲音(使用AVAudioPlayer播放的聲音)也不會播放(即使當我關閉屏幕時,後臺播放的聲音也會播放(當我用一些聲音替換「空」音頻文件時)再次)。 我不知道它在哪一點停止工作(它確實在3.x操作系統上工作)。難道我做錯了什麼?蘋果是否改變/修復了即使屏幕關閉也可讓您的應用程序工作的「黑客」?是否有其他方法可以讓設備進入睡眠狀態(並減少電池電量),但是繼續工作?關閉屏幕播放聲音/不要讓iPhone進入睡眠狀態

這是我用它來播放背景/無聲聲音代碼:

-(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 :) - 隨意使用它(但是如果你給我發一條消息會很酷,所以我會知道我的幫助: ))。

回答

5

所以答案是設置會話類別。當設備被鎖定時,某些類別只會關閉聲音。對我來說,最好的選擇是AVAudioSessionCategoryPlayback

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: nil]; 
+0

非常感謝!這一行代碼將我的背景音頻重新帶回了生活。 – 2017-12-30 16:13:35

0

我不知道蘋果公司正在修理的東西,但是在iOS 4中現在有official ways繼續在你應該利用的背景中做事。

+0

的「多任務處理」是不會爲我的申請工作,因爲它在後臺運行,只有當iphone已經投入時,應用程序被「關閉不睡覺「但無論如何感謝 - 我確信它會幫助某人 – shw 2010-11-24 20:44:08

相關問題