2012-04-23 4 views
8

In meiner App möchte ich Benutzer Audio-Wiedergabe im Hintergrund steuern lassen. Ich stelle backGround-Modi in .plist ein und spiele in bg genau so, wie ich es wollte. Aber ich bekomme keine Antwort, wenn ich die Steuertasten berühre.Kann nicht beginnenReceivingRemoteControlEvents in iOS

stelle ich die AudioSession wie diese

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance]setActive:YES error:nil]; 

in viewContoller Dann, wo mein Player Ich mag dieses

if ([[UIApplication sharedApplication] respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]; 
    [self becomeFirstResponder]; 
    NSLog(@"Responds!"); 
} 

beginReceivingRemoteControlEvents gesetzt und er druckt Responds!

Aber das Problem ist, dass Diese Methode wird nie

aufgerufen
- (void)remoteControlReceivedWithEvent:(UIEvent *)event 
{ 
    NSLog(@"Where is my event?"); 
    if(event.type == UIEventTypeRemoteControl) 
    { 
     switch (event.subtype) { 
      case UIEventSubtypeRemoteControlTogglePlayPause: 
       NSLog(@"Pause"); 
       [self playWords:playButton]; 
       break; 
      case UIEventSubtypeRemoteControlNextTrack: 
       NSLog(@"Next"); 
       [self next]; 
       break; 
      case UIEventSubtypeRemoteControlPreviousTrack: 
       NSLog(@"Prev"); 
       [self prev]; 
       break; 

     } 
    } 

Ich habe sogar versucht, eine Kategorie UIApplication zu schreiben, um es der erste Responder werden zu lassen, aber es ist nicht

@implementation UIApplication (RemoteEvents) 
-(BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 
@end 

Warum kann Geschieht dies helfen?

SOLUTION Hier ist, was Entering background on iOS4 to play audio mein Problem gelöst

Antwort

13

ich die gleiche Arbeit in meinem Projekt getan haben, es funktioniert gut. Bitte folgen Sie diesem, vielleicht wird es Ihnen helfen. Ändern Sie den Namen des Ereignisses usw. In meinem Code ist _audio das Objekt von AVAudioPlayer.

- (void)viewDidLoad { 
    NSError *setCategoryErr = nil; 
    NSError *activationErr = nil; 
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr]; 
    [[AVAudioSession sharedInstance] setActive: YES error: &activationErr]; 
} 

- (void)viewWillAppear { 

     [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 
} 


- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    switch (event.subtype) { 
     case UIEventSubtypeRemoteControlPlay: 
      [_audio play]; 
      break; 
     case UIEventSubtypeRemoteControlPause: 
      [_audio pause]; 
      break; 
     default: 
      break; 
    } 
} 
+0

Vielen Dank, aber soweit ich sehen kann, ist es genau das gleiche –

+0

Eine andere Sache ist, dass Sie es nicht auf Simulator testen können, verwenden Sie Gerät, wenn Sie Simulator verwenden, um Ereignisse und Backgroung Musik zu testen. –

+0

Ich teste auf Gerät ein) –

1

Überprüfen Sie diese sample code von Apple für ein Anwendungsbeispiel. Wahrscheinlich wird Ihr primärer View-Controller nicht der erste Responder. Eine alternative Verwendung besteht darin, diesen Code in Ihrem Anwendungsdelegaten (der immer der Ersthelfer ist) zu platzieren und auf diese Ereignisse zu reagieren, bevor sie sich verbreiten konnten und möglicherweise von anderen Antwortenden konsumiert wurden.

0

Sie haben

respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 

aber in der Methodensignatur haben Sie

- (void)remoteControlReceivedWithEvent:(UIEvent *)event 

Der Ort, an dem Sie die Signatur registrieren falsch ist. ersetzen Sie es einfach durch

respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){ 

Sie vermissen das: das macht die App die auch auf eine nicht existierende Methode sende ich davon aus bin. Ich bin überrascht, dass Ihre App nicht abstürzt.

4

Es gibt einen neueren Mechanismus zum Abhören von Fernsteuerungsereignissen.

MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter]; 

    [commandCenter.togglePlayPauseCommand addTargetWithHandler:^MPRemoteCommandHandlerStatus(MPRemoteCommandEvent * _Nonnull event) { 
     NSLog(@"toggle button pressed"); 
     return MPRemoteCommandHandlerStatusSuccess; 
    }]; 

oder, wenn Sie es vorziehen, ein Verfahren anstelle eines Blocks zu verwenden: Um zum Beispiel einen Block, wenn der Kopfhörer Wiedergabe/Pause-Taste gedrückt wird auszuführen

[commandCenter.togglePlayPauseCommand addTarget:self action:@selector(toggleButtonAction)]; 

zu beenden:

[commandCenter.togglePlayPauseCommand removeTarget:self]; 

oder:

[commandCenter.togglePlayPauseCommand removeTarget:self action:@selector(toggleButtonAction)]; 

Sie werden diese hinzufügen müssen, um die Fläche der Datei enthält:

@import MediaPlayer; 

Denn es im Hintergrund zu arbeiten, können Sie den Hintergrund-Audio-Modus zu Ihrem App-Funktionen hinzugefügt haben.

+0

Das machte meinen Tag. Danke vielmals!!! –

Verwandte Themen