2010-11-24 10 views
1

私はアプリケーションを持っているので、画面がオフになっても機能し続けたい。 これを行う前に、私はこのハック/トリックを使用しました - バックグラウンド(AudioServicesPlaySystemSound)のループで静かな/空のサウンドを再生します。ユーザーがオン/オフボタンを押すと、アプリケーションはバックグラウンドで動作します。 iPhoneをスリープモードにすることは決して許されません。画面をオフにしたり、Wi-FiやBluetoothのようなものをオフにしたりします。そしてそれは働いた。私は新しいアプリケーションで同じトリックを使いたいと思っていましたが、今テストしていたときにもう動作しないようです。 (AVAudioPlayerを使用して)再生するサウンドが再生されない(たとえスクリーンを回転させても、バックグラウンドで再生されるサウンドが再生されますもう一度)。 私はどの時点で動作が停止したのかわかりません(それは3.x OSで動作していました)。私は何か間違っているのですか? Appleは画面をオフにしてもアプリを動作させる「ハック」を変更/修正しましたか?デバイスがスリープ状態になる(そしてバッテリの消費が少なくなります)が、動作し続ける別の方法はありますか?画面をオフにしてサウンドを再生する/ 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

答えは、セッションカテゴリを設定することです。一部のカテゴリでは、デバイスがロックされているときに音が鳴りません。私にとって最良のオプションは、「マルチタスク」は、それはそれはアプリが「オフにするとiPhoneがないスリープ状態に置かれている場合にのみ、バックグラウンドで動作しているので、自分のアプリケーションのために動作しませんでしたAVAudioSessionCategoryPlayback

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

ありがとうございました!この1行のコードは、私のバックグラウンドオーディオを再び生き生きとさせました。 –

0

アップルの修理についてはわかりませんが、iOS 4では、利用するべきバックグラウンドで作業を続けるために、現在official waysがあります。

+0

ました"とにかく感謝 - 誰かを助けると確信しています – shw

関連する問題