iOS10.3 で MPMusicPlayerController クラスの挙動が変わった

デバイスをiOS10.3にアップデートしたら自作の音楽再生アプリでバグが発生しました。選んだ曲と別のものが再生されるバグです。

はじめに

この問題について述べる前にMPMusicPlayerControllerクラスのことを軽く書きます。
デバイスに入っている音楽を自作アプリ内で流すとき、曲のリストを取得してMPMusicPlayerControllerクラスのインスタンス(この記事ではこれをPlayerと呼ぶことにします)にセットします。その後、Playerに対して曲の再生、停止などの指令を出します。

//.h
MPMusicPlayerController  *iPodMusicPlayer;
MPMediaQuery    *albumsQuery;
MPMediaItemCollection  *selectedAlbumCollection;

//.m
iPodMusicPlayer = [MPMusicPlayerController systemMusicPlayer]; //Playerの作成
albumsQuery = [MPMediaQuery albumsQuery]; //アルバム単位で情報を取得
selectedAlbumCollection = [albumsQuery.collections objectAtIndex:6]; //6のアルバムの情報を取得
[iPodMusicPlayer setQueueWithItemCollection:selectedAlbumCollection]; //取得した6のアルバムの情報をPlayerにセット
[iPodMusicPlayer play]; //再生指令

Playerの作成するときは
  • systemMusicPlayer
  • applicationMusicPlayer
のいずれかで作成します。

ここから今回の問題についてです。
何パターンかの操作を行うことで問題の症状を細かく炙り出しました。

症状1

曲の再生を停止すると、Playerに設定した曲のリストが無効になる。(再設定が必要。)
Playerに対するstop指令で失う。pause指令では失わない。

曲のリストを失ったら、次に再生する前にリストを設定し直します。新たにMPMediaQueryから曲のリストを取得して設定すればOKです。

症状2

いちいちMPMediaQueryから取得しなくてもリストを保存しておいてそれを設定すればいいのだが、これをやろうとすると前回と同じ曲のリストを設定したときにうまくいかない。別のリストだとうまくいく。これは多分、現在値情報などがリセットされるのを避けるために同じリストを設定した場合は何もしないという処理になっていて、その機能に前回設定したリストが残っていると予想。なので、何か設定するときは、一旦空のリストを設定してからならうまくいく。

同じ曲のリストでも新たにMPMediaQueryから取得したものだとOKなのは別のリストと認識しているのだろうか?

ちなみに、曲のリストを失った後、リストの設定をしないでplay指令を送ったときの現象は
systemMusicPlayerの場合は何か勝手に選ばれた曲が再生される。
applicationMusicPlayerの場合は何も再生されない。
となる。

症状3

プレイ中にプレイ指令を送ると内部で混乱する。
これはiOS10.3より以前からあったかもしれませんが今回見つけました。

コメント