クラウドにあるアイテムを除外
動作を確認した環境
| 環境 | 情報 |
|---|---|
| Xcode | 6.3.2 (6D2105) |
| iOS | 8.3 |
| Swift | 1.2 |
| Date | 2015/6/6 |
クラウドにあるアイテムを除外
自分で作成したプレイリストを試しにprintln()で出力してみると、iPhoneに転送してない曲までプレイリストに入ってることがわかる。これは、MPMediaQuery.songsQuery()がクラウド上のアイテムまで一覧に含めてくるのが原因。
実機にない曲を再生しても、裏でiOSが良きに計らってくれるので特に問題は起きないんだけど、転送してない曲が勝手にダウンロードされて再生されるのは気持ち悪いって人もいるかも。
というわけで、クラウド上のアイテムを除外するように修正してみた。
/// プレイリストを更新
func updatePlaylist() {
let query = MPMediaQuery.songsQuery()
// クラウドにあるアイテムを除外
let num = NSNumber(bool: false)
let pre = MPMediaPropertyPredicate(value: num, forProperty: MPMediaItemPropertyIsCloudItem)
query.addFilterPredicate(pre)
if var all_ar = query.items as? [MPMediaItem] {
// 再生回数と曲名でソート
all_ar.sort() { s0, s1 in
if s0.playCount == s1.playCount {
// FIXME: 間違ってはいないが正しくもない
return s0.title < s1.title
} else {
return s0.playCount < s1.playCount
}
}
// 最大で100件取り出し
let no = min(100, all_ar.count)
playlist = [MPMediaItem](all_ar[0..<no])
}
}
MPMediaPropertyPredicateで簡単に処理してある。ちゃんとしたアプリに仕上げるなら、この辺の処理はユーザーが設定できるようにするべきかな。
ちなみに、iPhoneの中のiTunes Storeアプリでサインオフを選べば、勝手にダウンロードされた曲はミュージックアプリの一覧から消えるはず。たぶん。
ソースコード
最終的なソースコードはこちら。
See_Ku / MusicPlayerTips — Bitbucket
https://bitbucket.org/See_Ku/musicplayertips
https://itunes.apple.com/jp/app/46-minute-shuffle/id991599315?mt=8&uo=4&at=10l8JW&ct=hatenablog