9

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

私はAudioSessionこのように設定します

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

次に、私のプレーヤーが配置されているviewContollerで、私はこれがbeginReceivingRemoteControlEvents好きです

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

そして、それは印刷しますResponds!

しかし問題は、このメソッドが呼び出されないことです

    - (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 これが私の問題を解決したものですiOS4でバックグラウンドに入ってオーディオを再生する

4

4 に答える 4

13

I have done the same work in my project, it's working fine. Please follow this, perhaps it will help you. Change the event name etc. In my code _audio is the object of 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;
    }
}
于 2012-04-23T09:59:33.820 に答える
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)];

これをファイルの include 領域に追加する必要があります。

@import MediaPlayer;

バックグラウンドで動作させるには、アプリの機能にバックグラウンド オーディオ モードを追加する必要があります。

于 2015-09-03T10:49:04.227 に答える
1

使用例については、Apple のこのサンプル コードを確認してください。プライマリ View Controller が実際にはファーストレスポンダになっていない可能性があります。別の使用法として、このコードをアプリケーション デリゲート (常に最初のレスポンダー) に配置し、これらのイベントが伝達される前にこれらのイベントに応答し、他のレスポンダーによって消費される可能性があります。

于 2012-05-05T23:49:54.333 に答える
0

あなたが持っている

respondsToSelector:@selector(beginReceivingRemoteControlEvents)]){

しかし、メソッドシグネチャには

- (void)remoteControlReceivedWithEvent:(UIEvent *)event

署名を登録する場所が間違っています。置き換えるだけです

respondsToSelector:@selector(beginReceivingRemoteControlEvents:)]){

私が想定している存在しないメソッドにアプリを送信させる:がありません。アプリがクラッシュしていないことに驚いています。

于 2012-12-10T14:50:15.507 に答える