안드로이드와 다르게 아이폰에서는 따로 노래 파일이 없다.
찾아본 결과, MediaPlayer Framework를 사용하면 노래 데이터를 가져올 수 있다.
관련 StackOverflow 글
MediaPlayer Framework는 MusicKit에 포함되어있다.
자세한 것은 애플공식문서 참고.
이런식으로 내가 필요한 다양한 데이터들이 있다.
음악을 재생하기 위해서는 플레이어가 있어야하는 것처럼, MPMusicPlayerController가 필요하다.
Player의 종류는 두 가지가 있는데, Application Music Player와 System Music Player가 있다.
Application Music Player
- 지금 만들고 있는 커스텀 앱에서 노래 재생
System Music Player
- 애플 뮤직에서 노래 재생
info.plist 에 NSAppleMusicUsageDescription을 넣어주어야 한다.
그렇지 않으면 에러가 발생한다.
접근 권한의 이름은 Privacy로 시작한다.
iOS에서는 간단하게 접근 권한 설정이 가능하다.
옆의 String의 value 값은 사용자 권한을 요청할 때 표시할 문자열이다.
추가는 빈 곳에 우클릭-add row로 가능하다.
참고로 접근 권한이 필요한 경우에만 경고창을 띄운다.
//
// MusicFetcher.swift
// BearPlay
//
// Created by 루딘 on 12/13/23.
//
import Foundation
import MediaPlayer
struct Album{
var title: String
var artist: String
var artwork: UIImage
}
class MusicFetcher{
static let instance = MusicFetcher()
private var albumsCollection: [MPMediaItemCollection]?
private var albums = [Album]()
func refreshAlbums(){
self.makeAlbumsQuery()
self.setAlbums()
}
private func makeAlbumsQuery(){
if let collections = MPMediaQuery.albums().collections{
self.albumsCollection = collections
} else {
self.albumsCollection = nil
}
}
private func setAlbums(){
albums.removeAll()
albumsCollection?.forEach({libraryAlbumItem in
let libraryRepresentativeItem = libraryAlbumItem.representativeItem
let newAlbumTitle = libraryRepresentativeItem?.albumTitle ?? ""
let newAlbumArtist = libraryRepresentativeItem?.albumArtist ?? ""
let newAlbumArtwork = libraryRepresentativeItem?.artwork?.image(at: CGSize(width: 500, height: 500)) ?? UIImage()
let newLibraryAlbum = Album(title: newAlbumTitle, artist: newAlbumArtist, artwork: newAlbumArtwork)
albums.append(newLibraryAlbum)
})
}
}
(참고 블로그)
makeAlbumsQuery
: 유저의 라이브러리에 있는 앨범의 정보들을 가져와 넣어줌
MPMediaQuery
: 사용자 기기의 라이브러리를 필터링하고 그룹핑한 쿼리
이하의 기준으로 그룹핑 해줄 수 있다.
setAlbums
: 가져온 데이터를 실제 우리의 Album 리스트에 저장한다.
이제 가져와진 데이터들을 테이블 뷰에 보이도록 뿌리면 된다.
MusicViewController의 viewDidLoad에서 refreshAlbums() 실행 시 화면