2017-10-19 2 views
0
沈黙の中で、このコードの結果

でMPMusicPlayerControllerキューを設定することはできません。私はMPMediaItemを持っており、それから正しくMPMediaItemCollectionを作成しました。そして、のMPMusicPlayerMediaItemQueueDescriptorは、です。では、なぜ私のプレーヤーは遊んでいないのですか?はMPMusicPlayerMediaItemQueueDescriptor

答えて

0

あなたはバグを発見しました。初期化子MPMusicPlayerMediaItemQueueDescriptor(itemCollection:)が完全に壊れているように見えます。これは、使用不能なキュー記述子になります。

回避策は可能であれば、もう一方のイニシャライザ、つまりMPMusicPlayerMediaItemQueueDescriptor(query:)を使用することです。

たとえば、この場合には、あなたが(元のコードの最後の4行で拾って)記述することができます。

let coll = MPMediaItemCollection(items: [song]) 
let predicate = MPMediaPropertyPredicate(
       value: song.persistentID, 
       forProperty: MPMediaItemPropertyPersistentID) 
let query = MPMediaQuery(filterPredicates: [predicate]) 
let q = MPMusicPlayerMediaItemQueueDescriptor(query: query) 
player.setQueue(with: q) 
player.play() 

は残念ながら、あなたは、単一のクエリを形成することができない多くの状況がありますあなたが本当に望んでいたMPMediaItemCollectionを取得します。

この特定の例では、MPMediaItemCollectionから作成されたMPMusicPlayerMediaItemQueueDescriptorではなく、MPMediaItemCollectionを使用してプレーヤーのキューを直接設定することで回避することもできます。

しかし、悲しいかな、はMPMusicPlayerMediaItemQueueDescriptorを必要とし、そのようなことのために、この全体のAPIは基本的にまずいしていること(例えばappend(_:)など)いくつかのコマンドがあります。それはiOS 10.1からホースされていて、iOS 11.1にホースされています。

0

「iOS 10.1以降はホースをかけられていて、iOS 11.1にはホールドされています。」 Seconded。

私は、単にMPMusicPlayerControllerを簡単に動作させ(最終的にはそれを管理する)、b)オフセットから曲を再生するようにしています。これは、iOS 10以前の製品が100%期待どおりに動作していたアプリです。

今のところ、これは(少なくとも再生する曲を取得に関して)私のために動作するコードです:

let currentPlayer = MPMusicPlayerController.applicationQueuePlayer() 
currentPlayer.repeatMode = .none 

self.currentCollection = MPMediaItemCollection(items: [mediaItem]) 
currentPlayer.beginGeneratingPlaybackNotifications() 

let query = MPMediaQuery.songs() 
let pred = MPMediaPropertyPredicate(value: mediaItem.persistentID, forProperty: MPMediaItemPropertyPersistentID) 
query.addFilterPredicate(pred) 
let desc = MPMusicPlayerMediaItemQueueDescriptor(query: query) 
currentPlayer.setQueueWith(desc) 

currentPlayer.prepareToPlay(completionHandler: {[unowned self] (error) in 
    MPMusicPlayerController.applicationQueuePlayer().play() 
}) 

それは私が私が考えるだろうか使用していたことに少し複雑です利用可能なAPIに基づく最も複雑な手段。しかし、他のいくつかの方法では、完了ブロックが呼び出されないか、まったく役に立たないエラーが発生することがあります。今はMPMusicPlayerControllerに関して5つのバグがAppleに報告されているので、私は瞬時に幸せな開発者ではない。私はsetStartTimeとしてこのコードに関連するものをもう1つ開きます。& setEndTimeは、指定されたオフセットで再生を開始するためにcurrentPlaybackTimeより優れているようには見えません。

このコードは、同期してダウンロードしたApple Musicアイテムを信頼して再生します。

+0

はい、そのコードは、私がすでに与えた答えと実質的に変わりません。私の答えで指摘したように、メディアアイテムのあらゆる任意のコレクションをクエリとして表現することはできません。 – matt