4

ビデオのオーディオをバックグラウンドで再生し、マルチタスクの再生/一時停止コントロールによって制御する必要がある MPMoviePlayerController があります。

.plist ファイルを更新しRequired background modesて以下を呼び出した後:

- (void)startBackgroundStreaming
{
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];

    NSError *activationError = nil;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:&activationError];
    [audioSession setActive:YES error:&activationError];

}

マルチタスクの再生/一時停止バーにアプリのアイコンが表示されますが、これらのボタンが反応しません。

ありがとう!

4

1 に答える 1

8

パズルの欠けているピースは、受信したリモート コントロール イベントを処理することです。-(void)remoteControlReceivedWithEvent:(UIEvent *)eventこれを行うには、アプリケーション デリゲートでメソッドを実装します。最も単純な形式では、次のようになります。

-(void)remoteControlReceivedWithEvent:(UIEvent *)event{
    if (event.type == UIEventTypeRemoteControl){
        switch (event.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:
                // Toggle play pause
                break;
            default:
                break;
        }
    }
}

ただし、このメソッドはアプリケーション デリゲートで呼び出されますが、次のように、ムービー プレーヤー コントローラーを所有するビュー コントローラーがイベントを取得できるように、イベントをオブジェクトとしていつでも通知を送信できます。

-(void)remoteControlReceivedWithEvent:(UIEvent *)event{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"RemoteControlEventReceived" object:event];
}

次に、通知に割り当てたリスナー メソッドでイベント オブジェクトを取得します。

-(void)remoteControlEventNotification:(NSNotification *)note{
    UIEvent *event = note.object;
    if (event.type == UIEventTypeRemoteControl){
        switch (event.subtype) {
            case UIEventSubtypeRemoteControlTogglePlayPause:
                if (_moviePlayerController.playbackState == MPMoviePlaybackStatePlaying){
                    [_moviePlayerController pause];
                } else {
                    [_moviePlayerController play];
                }
                break;
                // You get the idea.
            default:
                break;
        }
    }
}
于 2013-03-22T14:43:05.290 に答える