2010-11-24 2 views
1

So habe ich eine Anwendung, und ich möchte es funktioniert, auch wenn der Bildschirm ausgeschaltet ist. Zuvor benutzte ich diesen Hack/Trick - ich spiele einen stillen/leeren Sound in einer Schleife im Hintergrund (AudioServicesPlaySystemSound). Wenn der Benutzer den Ein-/Ausschalter drückt, funktioniert die Anwendung immer noch im Hintergrund - so erlaube dem iPhone nie, in den Schlafmodus zu gehen - es hat einfach den Bildschirm ausgeschaltet und vielleicht Dinge wie Wifi oder Bluetooth (und auf den iPod Touch Beschleunigungssensoren, soweit ich mich erinnere). Und es hat funktioniert. Ich wollte den gleichen Trick in meiner neuen Anwendung verwenden, aber als ich es jetzt getestet habe, scheint es, dass es nicht mehr funktioniert. Der Sound im Hintergrund wird abgespielt (wenn ich "leere" Audiodatei durch einen Ton ersetze, kann ich ihn abspielen), obwohl der Bildschirm ausgeschaltet ist, aber der Ton (mit AVAudioPlayer) nicht abgespielt wird (auch wenn ich den Bildschirm drehe) wieder). Ich weiß nicht, an welchem ​​Punkt es aufgehört hat zu arbeiten (es funktionierte auf 3.x OS sicher). Mache ich etwas falsch? Hat Apple den "Hack" geändert/repariert, mit dem Ihre App auch bei ausgeschaltetem Bildschirm funktioniert? Gibt es eine andere Möglichkeit, das Gerät in den Ruhezustand zu versetzen (und die Batterie weniger zu leeren), aber weiter zu arbeiten?Spielen Sie Sound mit Bildschirm ausgeschaltet/nicht lassen Sie das iPhone schlafen gehen

Dies ist der Code, den ich verwenden Hintergrund/silent Ton zu spielen:

-(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); 
} 

Und das ist, wie ich den Ton spielen, dass selbst ausgeschaltet wird, wenn der Bildschirm spielen:

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

Der Code ist vielleicht etwas kompliziert - es könnten nur die ersten paar Zeilen sein - so ist es möglich, nur X Sekunden Sound zu spielen (wenn der Sound kürzer ist als X), werden nur wenige Loops abgespielt bis die Gesamtzeit> = X ist). Und natürlich funktioniert alles gut, wenn der Bildschirm eingeschaltet bleibt.

Auch - wenn Sie den Code in Ihren Projekten nützlich finden (wie playSound: withLoops: stopAfter :) - zögern Sie nicht, es zu verwenden (aber es wäre cool, wenn Sie mir eine Nachricht senden, damit ich weiß, dass ich geholfen habe:)).

Antwort

5

Also die Antwort ist die Sitzung Kategorie festlegen. Einige Kategorien deaktivieren nur den Ton, wenn das Gerät gesperrt wird. Für mich ist die beste Option war AVAudioSessionCategoryPlayback

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

Vielen Dank! Diese eine Codezeile brachte meinen Hintergrundton wieder zum Leben. –

0

Ich weiß nicht über Apple-Reparatur Sachen, aber in iOS 4 gibt es jetzt official ways Dinge im Hintergrund weiter zu machen, die Sie nutzen sollten.

+0

Die „Multitasking“ war für meine Anwendung nicht funktionieren, da es nur im Hintergrund arbeiten muss, wenn das iPhone nicht in den Schlaf gebracht wurde, wenn es die App „ausgeschaltet "aber trotzdem danke - ich bin sicher, dass es jemandem helfen wird – shw

Verwandte Themen