Swiftのお勉強がてら音楽を再生できるようにしてみました。
元記事:http://sawapi.hatenablog.com/entry/2014/06/07/023814
つくったもの
だいぶシンプルな音楽プレイヤー。
iPhoneに入ってる曲を取り出してタップすると再生します。
ソースコード
ファイル構成
- AppDelegate.swift・・・そのまま
- ViewController.swift・・・Viewの処理
- SongQuery.swift・・・iPhoneに入っている曲の情報を返す
- Main.storyboard・・・NavigationControllerとTableViewおいただけ
コードの概要
曲リストの取得
func get() -> AlbumInfo[] {
var albums: AlbumInfo[] = []
// アルバム情報から曲を取り出す
var albumsQuery: MPMediaQuery = MPMediaQuery.albumsQuery()
var albumItems: MPMediaItemCollection[] = albumsQuery.collections as MPMediaItemCollection[]
var album: MPMediaItemCollection
for album in albumItems {
var albumItems: MPMediaItem[] = album.items as MPMediaItem[]
var song: MPMediaItem
var songs: SongInfo[] = []
var albumTitle: String = ""
// album情報から曲リストを取得する
for song in albumItems {
albumTitle = song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String
var songInfo: SongInfo = SongInfo(
albumTitle: song.valueForProperty( MPMediaItemPropertyAlbumTitle ) as String,
artistName: song.valueForProperty( MPMediaItemPropertyArtist ) as String,
songTitle: song.valueForProperty( MPMediaItemPropertyTitle ) as String,
// NSNumberじゃないとうまくいかない
songId: song.valueForProperty( MPMediaItemPropertyPersistentID ) as NSNumber
)
songs.append( songInfo )
}
var albumInfo: AlbumInfo = AlbumInfo(
albumTitle: albumTitle,
songs: songs
)
albums.append( albumInfo )
}
return albums
}
MPMediaQuery.albumsQuery()でアルバムのリストを取得できます。
songIdは、UInt64で動くと思ったらなぜか動かず。。NSNumberなら動きました。
選択した音楽を再生
func tableView( tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath! ) {
// MPMediaItemPropertyPersistentID
// 曲を識別するID
let songId: NSNumber = albums[indexPath.section].songs[indexPath.row].songId
// IDからMPMediaItemオブジェクトを取得
// SongQuery#getItemを参照
let item: MPMediaItem = songQuery.getItem( songId )
let url: NSURL = item.valueForProperty( MPMediaItemPropertyAssetURL ) as NSURL
//var error: NSError? = nil
// 再生
audio = AVAudioPlayer( contentsOfURL: url, error: nil )
audio.play()
self.title = albums[indexPath.section].songs[indexPath.row].songTitle
}
MPMediaItemのvalueForPropertyメソッドはAnyObjectを返すので型変換してあげます。
AVAudioPlayerのerrorの部分にNSErrorを入れてもうまくいきませんでした。。
やり方が分かったら直します。
まとめ
Objective-C自体あまり触ったことないですが、Swiftはかなり取っ付き易いです。
あとはコード補完さえなんとかなれば。。