[iOS] <BearPlay> 애플뮤직 노래 목록 데이터 가져오기

RudinP·2023년 12월 13일
0

Projects

목록 보기
12/28

안드로이드와 다르게 아이폰에서는 따로 노래 파일이 없다.
찾아본 결과, MediaPlayer Framework를 사용하면 노래 데이터를 가져올 수 있다.
관련 StackOverflow 글

MusicKit

MediaPlayer Framework는 MusicKit에 포함되어있다.
자세한 것은 애플공식문서 참고.

이런식으로 내가 필요한 다양한 데이터들이 있다.

MPMusicPlayerController

음악을 재생하기 위해서는 플레이어가 있어야하는 것처럼, 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() 실행 시 화면

profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글