アプリ内の AirPlay 経験値を豊かに
あなたのアプリで AirPlay を使用している場合、ユーザーのために豊かな経験値を提供することができるいくつかの方法があります。
- あなたのアプリで AirPlay のピッカーを提供して下さい。
- あなたのアプリの全てのオーディオが AirPlay 出力デバイスに移行し、そのユーザインタフェースの音声が、ホストデバイスで聞こえることを確認して下さい。
- AirPlay の出力装置上に表示することができるオーディオメタデータを提供して下さい。
- AirPlay の出力装置からのリモートイベントに応答して下さい。
- iOS ベースの装置のディスプレイと外部ディスプレイに別々のコンテンツ提供することで、外部ディスプレイを活用してください(これを行う方法を学ぶために、iOS 用マルチディスプレイ·プログラミング·ガイドを参照してください)。
- 高精細ビデオと AC3 のオーディオと別のデータストリームを提供して下さい(詳細については、「AC3 オーディオと高解像度映像を提供」を参照して下さい)。
AirPlay のピッカーを提供
ユーザーは、図3-1 に示すように、AirPlay の出力を選択できるように iOS のマルチタスクインタフェースで、システムの AirPlay ピッカーを選ぶことができます。AirPlay の出力デバイスを使用できる場合は、AirPlay のボタンが音量スライダの横に表示され、ボタンをタップすると使用可能なデバイスのリストが表示されます。
図3−1 システム AirPlay ピッカー
アプリがメディアを再生する場合は、ユーザーがフォーカスを変更する必要がないように、アプリ内での AirPlay 出力ピッカーを提供することをお勧めします。次のコードスニペットに示すように、MPVolumeView を使用して、メディア再生コントロールに AirPlay のピッカーを追加することができます。
MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ; [view addSubview:volumeView];
カスタムメディアコントローラを持っていて標準のボリューム·コントローラーを使用したくない場合は、次のコードスニペットを使用するだけで AirPlay ピッカーを追加することができます。
MPVolumeView *volumeView = [ [MPVolumeView alloc] init] ; [volumeView setShowsVolumeSlider:NO]; [volumeView sizeToFit]; [view addSubview:volumeView];
利用可能な AirPlay の出力デバイスがある場合にのみピッカーが表示されます。
オーディオをあるべき場所に送信
アプリは、典型的には、2つのタイプの音ーアプリの音(周囲の音や、背景音、および付随的雑音) およびシステムサウンド (キークリックや警告音など) を使用しています。 AirPlay は、サウンドシステムがホスト上にとどめようとするのに対しアプリの音を遠隔サウンドシステム上に配信しようとしますが、フィードバックサウンドシステムは入力デバイスに対しローカルなままにとどまります。
アプリがアプリ・オーディオ用のシステムサウンド API を使用している場合は、AirPlay に対応のサウンドシステムには AirPlay はリダイレクトしません。結果は最適とはほど遠いユーザーの経験値をもたらします。システム·サウンドで のみ システム・サウンド API を使用することが重要な点です。アプリのオーディオの場合、 AVAudioPlayer などのAPIを使用して下さい。
オーディオメタデータを提供
お使いのオーディオは、LCD ディスプレイと大画面のホームシアター·システムまたはサウンドシステム上で再生しているでしょうか。アーティスト名、曲名、アルバムアートなどの AirPlay デバイスのディスプレイに表示可能なメタデータを提供して、あなたのアプリは、より良いユーザー経験値を提供します。
MPNowPlayingInfoCenter の setNowPlayingInfo メソッドに辞書を渡すことで、メタデータを追加します。 MPNowPlayingInfoCenter クラスは MediaPlayer のフレームワークの一部ですが、 MediaPlayer、AVFoundation、 および AudioQueue を含むすべての再生フレームワークに対応しています。
通常の曲情報文字列を提供することに加えて、また、再生速度、経過時間、メディアアイテムの持続時間を渡すべきです。再生装置はプログレスバーを作成するため経過時間と再生速度を使用することができます。再生速度が変更した時に経過時間と再生速度を更新して下さい。
リモートイベントに応答
AirPlay が使用されている場合、あなたのメディアは、ホスト·デバイスとは別の部屋で再生している可能性があります。AirPlay の出力デバイスは、独自のコントロールを持っているか、または Apple のリモコンに反応するかもしれません。最高のユーザー経験値のためには、あなたのアプリは、再生、一時停止、早送りなどの要求のリモートイベントに耳を澄まし、応答して下さい。リモートイベントを有効にすると、アプリはヘッドホンやホストデバイスにプラグインされたイヤホンのコントロールに対応することができます。
リモートイベントを受信するためには、次のコードスニペットを使用して下さい。
- (BOOL) canBecomeFirstResponder {return YES;} - (void) viewDidAppear: (BOOL) animated { [super viewDidAppear:animated]; [ [UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; }
あなたのアプリがメディアの再生を終了すると、システムに、あなたがもはやリモートのイベントの受信者ではない事を、以下のコード・スニペットで通知しましょう。
- (void) viewWillDisappear: (BOOL) animated { [super viewWillDisappear:animated]; [ [UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder]; }
UIEventTypeRemoteControl 型のイベントや、あなたのアプリ用の適切なサブタイプのイベントに対応しましょう。次のコードスニペットで、例を示します。
- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent { if (receivedEvent.type == UIEventTypeRemoteControl) { switch (receivedEvent.subtype) { case UIEventSubtypeRemoteControlTogglePlayPause: [self playPauseToggle: nil] break; case UIEventSubtypeRemoteControlNextTrack: [self nextTrack: nil] break; ...
イベントサブタイプの列挙については UIEvent.h を参照してください。
AirPlay の選択と除外
暗号化と認証