開発メモ

開発関係のメモをいろいろと。たぶん。

クラウドにあるアイテムを除外

動作を確認した環境

環境 情報
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