2012-04-23 5 views
8

私のアプリでは、ユーザーがバックグラウンドでオーディオ再生を制御できるようにします。 .plistでbackGroundモードを設定していたのと同じようにbgで再生しました。しかし、コントロールボタンに触れても反応はありません。iOSのReceiveRemoteControlEventsを開始できません

私は私のプレーヤーが私に beginReceivingRemoteControlEvents

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

を入れて、それがResponds!

を印刷します。しかし、問題があることですviewContollerで、その後AudioSession

このような
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance]setActive:YES error:nil]; 

を設定

このメソッドは決して呼び出されません

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

     } 
    } 

私もそれがファーストレスポンダになるようにするUIApplication上のカテゴリを書き込もうとしましたが、それは

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

は、なぜこれが発生する可能性が助けていないのですか?

SOLUTION は、ここで私は、それが正常に働いている私のプロジェクトで同じ仕事をしている私の問題Entering background on iOS4 to play audio

答えて

13

を解くものです。これに従ってください。恐らくそれはあなたを助けるでしょう。イベント名などを変更します。私のコード_audioは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

ありがとうございます、私が見る限り、それはちょうど同じです –

+0

別のことは、シミュレータを使用してイベントを削除し、音楽をバックグラウンドでテストしている場合、シミュレータでテストすることができないことです。 –

+0

私はデバイス上でテストする) –

1

アップルのこのsample codeを使用例を参照してください。あなたのプライマリビューコントローラが実際に最初のレスポンダになっていない可能性があります。このコードをアプリケーションの代理人(常に最初のレスポンダ)に配置し、伝播のチャンスがあり、他のレスポンダによって消費される前にこれらのイベントに応答することもできます。

0

あなたは

respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){ 

を持っていますが、メソッドシグネチャであなたは

- (void)remoteControlReceivedWithEvent:(UIEvent *)event 

あなたが署名を登録している場所が間違っているを持っています。ちょうどそれを置き換えて

respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){ 

私は推測している既存の方法にもアプリケーションを送信しています。私はあなたのアプリがクラッシュしていないことに驚いています。

4

リモートコントロールイベントをリッスンするための新しいメカニズムがあります。

MPRemoteCommandCenter *commandCenter = [MPRemoteCommandCenter sharedCommandCenter]; 

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

や、あなたの代わりに、ブロックの方法を使用することを好む場合:

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

停止するには:

ヘッドホン再生/一時停止ボタンが押された場合例えば、ブロックを実行します
[commandCenter.togglePlayPauseCommand removeTarget:self]; 

か:

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

あなたはあなたのファイルの領域を含む。これに追加する必要があります:それはバックグラウンドで動作するために、あなたは、バックグラウンドオーディオモードアプリの機能に追加しておく必要があり

@import MediaPlayer; 

+0

これは私の一日を作った。ありがとう、トン! –

関連する問題