[iOS 10.3] MPMusicPlayerController の append および prepend メソッドについて

2017.03.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

本記事では iOS 10.3 で Media Player frameworkMPMusicPlayerController に追加された新メソッドの使用方法を紹介していきます。

検証環境

  • macOS Sierra 10.12.3(16D32)
  • Xcode Version 8.3 beta 4 (8W143q)
  • iPhone 7 iOS 10.3 beta 5 (14E5269a)

MPMusicPlayerController

MPMusicPlayerController は Media Player framework が提供するクラスで、iTunes や Apple Music と同期している曲の再生などを行うことができます。

iOS 10.3 では append(_:) メソッドと prepend(_:) メソッドが追加されました。

append メソッド

  • 再生キューの末尾に曲を追加するためのメソッド
  • iOS 標準のミュージックアプリの「後で再生」機能と同じ処理を行うことができる

prepend メソッド

  • 再生キューの先頭 (または再生中の曲の次) に曲を追加するためのメソッド
  • iOS 標準のミュージックアプリの「次に再生」機能と同じ処理を行うことができる

実装

MPMusicPlayerController の append および prepend メソッドは MPMusicPlayerMediaItemQueueDescriptor または MPMusicPlayerStoreQueueDescriptor とともに使用できます。どちらも曲のリストを表すクラスです。

MPMusicPlayerMediaItemQueueDescriptor を使用する

MPMusicPlayerMediaItemQueueDescriptor は MPMediaQuery または MPMediaItemCollection から作成でできます。

MPMediaQuery から Descriptor を作成する

MPMediaQuery は ミュージックライブラリから曲やアルバムを取り出すためのクエリクラスです。

以下の例では指定のタイトルの曲を再生キューの末尾に曲を追加する実装です。iOS 10.3 beta 5 で動作確認してみたところ期待通りに動きました。

let predicate = MPMediaPropertyPredicate(value: "Messages from nowhere",
                                         forProperty: MPMediaItemPropertyTitle)
let query = MPMediaQuery(filterPredicates: [predicate])
let descriptor = MPMusicPlayerMediaItemQueueDescriptor(query: query)

MPMusicPlayerController.systemMusicPlayer().append(descriptor)
// MPMusicPlayerController.systemMusicPlayer().prepend(descriptor)

MPMediaItemCollection から Descriptor を作成する

MPMediaItemCollection は「アルバム」などの曲の集合を表すクラスです。

MPMediaQuery と同様の手順で Descriptor を作成できるメソッドが用意されていますが、iOS 10.3 beta 5 で動作確認してみたところ期待通りに動きませんでした。 (再生キューに曲が追加されない)

let mediaItemCollection = ...
let descriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: mediaItemCollection)

MPMusicPlayerController.systemMusicPlayer().append(descriptor)
// MPMusicPlayerController.systemMusicPlayer().prepend(descriptor)

MPMediaItemCollection を一旦 MPMediaQuery に変換すると、再生キューに曲を追加できました。

let mediaItemCollection = ...
let predicate = MPMediaPropertyPredicate(value: mediaItemCollection.representativeItem!.persistentID,
                                         forProperty: MPMediaItemPropertyPersistentID)
let query = MPMediaQuery(filterPredicates: [predicate])
let descriptor = MPMusicPlayerMediaItemQueueDescriptor(query: query)

MPMusicPlayerController.systemMusicPlayer().append(descriptor)
// MPMusicPlayerController.systemMusicPlayer().prepend(descriptor)

MPMusicPlayerStoreQueueDescriptor を使用する

MPMusicPlayerStoreQueueDescriptor を使用すれば、Apple Music で提供されている曲を再生キューに追加できます。

Descriptor 作成時に使用する storeID は「iTunes Search API」を使用して取得できます。storeID の取得手順はこちらの記事で紹介しています。

iOS 10.3 beta 5 で動作確認してみたところ期待通りに動きました。

let storeID = ...
let descriptor = MPMusicPlayerStoreQueueDescriptor(storeIDs: [storeID])
MPMusicPlayerController.systemMusicPlayer().append(descriptor)
// MPMusicPlayerController.systemMusicPlayer().prepend(descriptor)

さいごに

本記事では、iOS 10.3 で MPMusicPlayerController に追加された新メソッドの使用方法を紹介しました。

今回紹介したサンプルのソースコードは以下のリポジトリで公開してますので参考にしてみてください。

次回の記事では MPMusicPlayerApplicationController の使用方法を紹介する予定です。

参考資料