0

私たちのアプリは、リモート コントロール イベントへの最初のレスポンダーになることで、リモート コントロールを使用するユーザー フォームを明示的にブロックします。ただし、iOS7 では、同じコードがコントロール センターの音楽コントロールをバイパスできません。

テストの結果、コントロール センターは、UIEventSubtypeRemoteControlPause と UIEventSubtypeRemoteControlPlay、および UIEventSubtypeRemoteControlTogglePlayPause を含むすべての音楽コントロール イベントをバイパスしたようです。

コントロールセンターがリモコン用の独自のプロトコルを持っているということですか、それとも iOS7 でリモコンイベントをインターセプトする方法が変わったということですか?

同じブロッキング コードは、iOS6 デバイスでも完全に機能します。これが私たちがすることです:

  1. appDelegate にメソッドを追加しました。

    (BOOL)canBecomeFirstResponder { YES を返します。}

  2. これを applicationDidBecomeActive で呼び出します。

    [[UIApplication sharedApplication] beginRecomingRemoteControlEvents];

    // 自分自身をファーストレスポンダーに設定 [self becomeFirstResponder];

  3. これを applicationWillResignActive で呼び出します

    // リモコン イベント配信をオフにする [[UIApplication sharedApplication] endRecomingRemoteControlEvents];

    // ファーストレスポンダとして辞任 [self rejectFirstResponder];

  4. 最後に追加

(void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent {

    if (receivedEvent.type == UIEventTypeRemoteControl) {
        
        switch (receivedEvent.subtype) {
                
            case UIEventSubtypeRemoteControlTogglePlayPause:
                NSLog(@"Received: UIEventSubtypeRemoteControlTogglePlayPause\n");
                break;
                
            case UIEventSubtypeRemoteControlPreviousTrack:
                NSLog(@"Received: UIEventSubtypeRemoteControlPreviousTrack\n");
                break;
                
            case UIEventSubtypeRemoteControlNextTrack:
                NSLog(@"Received: UIEventSubtypeRemoteControlNextTrack\n");
                break;
                
            case UIEventSubtypeRemoteControlPlay:
                NSLog(@"Received: UIEventSubtypeRemoteControlPlay\n");
                break;

            case UIEventSubtypeRemoteControlPause:
                NSLog(@"Received: UIEventSubtypeRemoteControlPause\n");
                break;

            case UIEventSubtypeRemoteControlStop:
                NSLog(@"Received: UIEventSubtypeRemoteControlStop\n");
                break;
                
            default:
                NSLog(@"Received: Some remove control events\n");
                break;
        }
    }
}

任意のポインタをいただければ幸いです。

4

2 に答える 2

1

少なくとも CoreAudio レベルでは、何が起こったのかをよりよく理解していると思います。

アプリのオーディオ セッション カテゴリがソロ アンビエントの場合、音楽アプリの再生イベントは、目覚まし時計や電話と同様に、オーディオ セッションの中断をトリガーします。これにより、「enter-interruption」状態でアプリのオーディオ セッション中断リスナー コールバックがトリガーされます。

ただし、音楽アプリの一時停止イベントは、期待どおりに「終了割り込み」状態のリスナー コールバックをトリガーしません。この exit 呼び出しの欠落により、アプリのオーディオ セッションが事実上フリーズします。コントロールセンターを終了しても、それはトリガーされません。物理的なリモート コントロールにも同じことが当てはまりますが、物理的なリモート コントロールは、前回のメールで述べた firstResponder のトリックを使用してブロックできます。コントロールセンターでは機能しません。

明らかな何かを見落としていない限り、コマンド チェーンの CoreAudio または他のフレームワークのいずれかに 2 つのバグがあると確信しています。

バグ 1: オーディオ セッションの中断リスナーの退出コールは、入室コールが最初に行われた場合、ミュージック リモコンから行うことができません。

バグ 2: コントロール センターの音楽リモコンは、リモコンのイベント メカニズムに準拠していません。

誰もこれを報告しなかったことにただ驚いています。

誰かが別の提案をしない限り、バグレポートを提出するつもりだと思います。

更新 バグ 2 は誤報でした。数回、iOS7 SDK ですべてをクリーンに再構築した後、問題が解決したことがわかりました。バグ 1 は引き続き保持されます。

于 2013-10-31T14:14:24.097 に答える
1

音楽アプリをブロックすることはできません。ただし、アプリは1つになる可能性があり(Appleはそれを好まない)、コントロールセンターがあなたのアプリを制御します

于 2013-10-30T15:20:32.100 に答える