자 유저의 Apple Music 앱 라이브러리에 접근할 수 있는 권한을 가져왔으니, 이제 정보를 가져오면 되겠죠??
자, 제 앱의 라이브러리 창을 보시면!!
필요한 정보가 그렇게 많지는 않습니다ㅎㅎ
일단 앨범의 표지, 앨범의 이름, 앨범의 아티스트.
이렇게 3개죠??
저는 이렇게 가져와주었습니다ㅎㅎ
복잡해 보이지만, 하나도 어렵지 않아요!! 정말입니다.
private var albumsItemCollection: [MPMediaItemCollection]?
private var albums = [Album]()
//MARK: 가져온 앨범 정보를 저장할 구조체
struct Album {
var title: String
var artist: String
var artwork: UIImage
}
func refreshAlbums() {
self.makeAlbumsQuery()
self.setAlbums()
}
private func makeAlbumsQuery() {
if let collections = MPMediaQuery.albums().collections {
self.albumsItemCollection = collections
} else {
self.albumsItemCollection = nil
}
}
private func setAlbums() {
albums.removeAll()
albumsItemCollection?.forEach({ libraryAlbumItemCollection in
let libraryAlbumRepresentativeItem = libraryAlbumItemCollection.representativeItem
let newAlbumTitle = libraryAlbumRepresentativeItem?.albumTitle ?? AppString.undefinedString
let newAlbumArtist = libraryAlbumRepresentativeItem?.albumArtist ?? AppString.undefinedString
let newAlbumArtwork = libraryAlbumRepresentativeItem?.artwork?.image(at: CGSize(width: 500, height: 500)) ?? UIImage()
let newLibraryAlbum = Album(title: newAlbumTitle, artist: newAlbumArtist, artwork: newAlbumArtwork)
albums.append(newLibraryAlbum)
})
}
자, 하나씩 설명해드릴게요!!
먼저 refreshAlbums 함수를 보시면,
makeAlbumQuery와 setAlbums라는 함수를 순서대로 실행해주고 있어요!!
각각 함수의 역할은 무엇이냐??
makeAlbumQuery 함수는 말 그대로 유저의 라이브러리에 있는 앨범의 정보들만 가져와서 넣어주는 역할을 합니다.
음... 근데 Query는 뭐야?? Album만 어떻게 가져오는건데?? 여기서 Collection은 또 뭐고??
이것들을 이해하기 위해서는 MPMediaQuery객체가 하는 역할을 알고 있어야 합니다ㅎㅎ
저는 이런게 있는지 처음에 몰라서 정말 애를 먹었었는데요...
여기 사용법이 자세하게 있으니, 보고 오시면 좋습니다ㅎㅎ
애플 공식문서 그대로, MPMediaQuery는 사용자의 기기에 있는 라이브러리를 필터링하고 그룹핑 한 쿼리를 의미합니다!!
우리는 이 쿼리를 이용해서, 라이브러리에서 소스들을 긁어옵니다ㅎㅎㅎ
이 쿼리를 만들기 위해서는,
요런 생성자들을 이용해주어야 합니다.
즉, 우리는 MPMediaQuery를 저런 기준을 통해 인스턴스화 시켜주는 거죠ㅎㅎㅎ
그럼 저는... album을 기준으로 앱을 만들거니까... 당연히 albums()를 가지고 인스턴스화 시켜야겠죠??
자 근데, 여기서 끝이 아닙니당
우리가 만든건 단지 쿼리이고, 쿼리에 따라서 item들을 긁어와줘야 합니다.
마저 읽어보시면 아시겠지만,
요렇게!! item들이 들어있는 Collection을 가져와주면 됩니다.
collection은 item들의 Set라고 생각하시면 되요..
우리는 Album을 가져오는 거니깐, album item들의 Set라고 생각하시면 됩니다ㅎㅎ
저는 이 쿼리를 이용하려면, 다른 함수 매개변수로 이용해야 하는줄 알고 한참을 찾았었는데,
그냥
let collections = MPMediaQuery.albums().collections
요렇게 해주면 알아서 가져오더라고요???
아... 너무 불친절한 공식문서...
저 collections을 사용하면,
[MPMediaItemCollection]
타입을 가진 "정렬"된 형태의 itemCollection들이 들어오게 됩니다.
(일단 album같은 경우는 가나다 순으로 정렬이 되서 들어오더라구요ㅎㅎ)
아까 우리가 albums() 생성자로 만든 쿼리로 펄티링한 값이기 때문에, 이 itemCollection에는 album item들이 들어가있게 됩니다.
그리고, 앨범은 다음과 같은 key들을 가지고 있어요!!
자, 아까 우리에게 필요한게 뭐라고 했죠??
앨범의 표지, 앨범의 이름, 앨범의 아티스트 입니다ㅎㅎ
우리가 원하는게 뭔지 알면 이렇게 item마다 하나씩 돌면서 손쉽게 값을 가져올 수 있습니다ㅎㅎ
albumsItemCollection?.forEach({ libraryAlbumItemCollection in
let libraryAlbumRepresentativeItem = libraryAlbumItemCollection.representativeItem
let newAlbumTitle = libraryAlbumRepresentativeItem?.albumTitle ?? AppString.undefinedString
let newAlbumArtist = libraryAlbumRepresentativeItem?.albumArtist ?? AppString.undefinedString
let newAlbumArtwork = libraryAlbumRepresentativeItem?.artwork?.image(at: CGSize(width: 500, height: 500)) ?? UIImage()
let newLibraryAlbum = Album(title: newAlbumTitle, artist: newAlbumArtist, artwork: newAlbumArtwork)
albums.append(newLibraryAlbum)
})
이렇게 MediaPlayer 프레임워크의 기능을 이용하면, 손쉽게 원하는 AppleMusic 앱의 라이브러리 정보를 뽑아올 수 있습니다ㅎㅎ
'iOS 개발 > MusicKit' 카테고리의 다른 글
[MusicKit] MediaPlayer 프레임워크 (3) - Apple Music 접근 권한 가져오기 (0) | 2022.02.06 |
---|---|
[MusicKit] MediaPlayer 프레임워크 (2) (0) | 2022.02.05 |
[MusicKit] MediaPlayer 프레임워크 (1) (0) | 2022.02.05 |