Meet MusicKit for Swift [WWDC 2021]

Luke·2024년 7월 26일

WWDC

목록 보기
2/5

이글을 작성하는 이유는 Apple Music을 이용한 앱을 만들어 보려는 중, MusicKit에 대해서 알게되어 WWDC에서 소개한 MusicKit 영상을 봤는데 한글 자막이 없어 제가 번역본 느낌으로 작성 해봤습니다.



MusicKit은 앱이 Swift에서 음악 항목에 액세스할 수 있는 표현형 API를 제공하는 Apple 플랫폼용 새 프레임워크입니다. 이 프레임워크는 새로운 Swift 동시성 구문을 활용하며, 처음부터 SwiftUI와 함께 사용할 수 있도록 설계되었습니다. MusicKit은 앱이 Apple Music의 다양한 카탈로그 콘텐츠에 액세스하기 위한 서버 측 API 세트인 Apple Music API와 통합하는 방식을 가속화하여, Apple Music과 연동되는 매력적인 앱을 훨씬 더 쉽게 빌드할 수 있도록 해줍니다.

먼저 MusicKit으로 음악 콘텐츠를 요청하는 방법에 대해 설명하겠습니다. 다음으로 앱이 Apple 음악 관련 데이터에 액세스할 수 있도록 사용자에게 동의를 요청하는 방법, Apple Music API에 액세스하는 데 필요한 토큰 관리, 구독 정보 및 관련 기능 액세스, Apple Music 카탈로그에서 음악 재생, 마지막으로 사용자가 아직 구독자가 아닌 경우 Apple Music 구독 제안을 표시하는 방법 등 앱과 Apple 음악을 통합하는 데 중요한 기타 주제에 대해 설명합니다.


Music Requests

MusicKit은 음악 항목에 액세스하기 위한 새로운 모델 레이어를 제공하며, Apple Music API에서 콘텐츠를 가져올 수 있는 구조화된 요청을 제공합니다.

Apple Music 카탈로그에서 콘텐츠를 검색하거나 특정 필터를 기반으로 리소스를 가져올 수 있습니다.

이러한 요청은 컬렉션으로 그룹화된 항목이 포함된 응답을 생성하며, 이 응답은 페이지 매김을 기본적으로 지원하므로 초기 응답에서 다음 항목 배치를 가져올 수 있습니다.

그렇다면 이러한 음악 항목은 어떤 모습일까요? 앨범을 예로 들어 구체적인 예를 살펴보겠습니다. Album은 세 가지 범주로 그룹화된 속성이 있는 값 유형입니다. 첫 번째 카테고리에는 title과 같은 문자열 속성, isCompilation과 같은 부울 속성 또는 관련 크기 정보 및 관련 색상과 함께 아트웍의 URL에 액세스할 수 있는 artwork와 같은 보다 구조화된 속성과 같은 간단한 속성이 포함되어 있습니다.

Album은 또한 관련 artists 또는 genres 또는 특정 앨범의 tracks와 같은 여러 Relationships를 제공합니다. 예를 들어 tracks의 결과는 음악 항목의 또 다른 유형인 Track 유형의 값 모음입니다.

마지막으로, 이러한 강력한 모델 수준의 관계 외에도 Album은 관련 콘텐츠의 몇 가지 약한 Associations을 제공합니다. AssociationsRelationships와 매우 유사하지만 일반적으로 더 일시적이거나 편집에 의해 주도됩니다. 예를 들어, 앨범의 appearsOnPlaylist 컬렉션을 반환하지만, Relationships의 컬렉션과 달리 이 컬렉션에는 title도 있습니다.

MusicKit으로 관계를 로드하고 액세스하는 것은 매우 간단합니다.

앨범이 주어지면 .artists.tracks 과 같은 관계는 물론 .relatedAlbums와 같은 연관성을 포함하는 동일한 앨범의 다른 표현을 한 번의 작업으로 쉽게 가져올 수 있습니다.

with 메서드는 특수 Swift 키워드 await를 사용하여 호출해야 하며, 이는 백그라운드에서 비동기 연산을 수행함을 나타냅니다. 이렇게 하면 실제로 네트워크를 통해 Apple Music API에서 이 앨범의 보다 완전한 표현을 가져옵니다.

그런 다음 이 세부 앨범에서 트랙 목록을 가져와(if let tracks ~) 일반 배열에서와 마찬가지로 해당 트랙을 반복할 수 있습니다.

이 코드의 콘솔 출력은 다음과 같습니다.

relatedAlbums와 같은 연결에 액세스하는 것도 같은 방식으로 작동하지만, 일반적으로 컬렉션에서 직접 액세스할 수 있는 title도 포함된다는 점이 다릅니다(relatedAlbums.title ~). 그런 다음 같은 방식으로 컬렉션을 반복하여 관련 앨범 몇 개를 인쇄할 수 있습니다.

다음은 이 코드의 콘솔 출력입니다.

검색 필드를 사용하여 앨범을 검색할 수 있으며, 최근에 본 앨범 목록도 추적합니다.

앨범을 선택하면 이 앨범에 대한 자세한 정보를 찾을 수 있습니다. 그리고 재생 버튼을 사용하거나 특정 트랙을 선택하여 이 앨범의 음악 재생을 시작할 수 있습니다. 이렇게 하면 MusicKit의 재생 API를 사용하여 이 트랙 목록으로 대기열을 설정하고 플레이어에서 재생 메서드를 호출하기만 하면 됩니다.

잠금화면의 미디어 컨트롤에서도 자동으로 작동해서 이 노래의 중간 지점으로 스크롤할 수 있습니다.

실제 앨범의 바코드를 이용하여 해당 앨범을 찾을수 도 있습니다.


범용 제품 코드(Universal Product Code)인 바코드 정보를 RequestMusicCatalogResourceRequest에 넣어서 정보를 받아올 수 있습니다.

MusicKit은 구조화된 요청과는 다른 범용 데이터 요청도 제공하는데, 이 요청은 URL을 사용하여 임의의 Apple Music API 엔드포인트에서 콘텐츠를 로드할 수 있다는 점에서 구조화된 요청과는 다릅니다.

이 요청에서 반환되는 것은 Apple Music API의 JSON 응답에 대한 원시 데이터입니다. 이 원시 데이터를 JSONDecoder로 디코딩해야 하지만, 기존 음악 항목 유형은 Codable 프로토콜을 준수하므로 이를 활용하는 것이 어렵지 않습니다.

예시를 살펴보겠습니다. Apple 음악의 최상위 장르 목록을 로드하려면 이 특정 URL에서 콘텐츠를 로드하면 되며, 이에 해당하는 JSON 응답은 다음과 같습니다.

이 결과를 자세히 살펴보면 중간에 장르 리소스처럼 보이는 것을 볼 수 있습니다. 그렇다면 이것을 Swift로 어떻게 표현할 수 있을까요? 당연히 MusicKit에는 장르 유형이 있습니다.

전체 응답을 Swift에서 어떻게 표현할 수 있을까요? 간단한 장르 배열인 데이터 멤버가 있는 구조체를 만들 수 있습니다. 그런 다음 이 구조체를 Decodable로 표시하세요. Genre 자체도 Decodable에 부합하기 때문에 추가적인 디코딩 로직을 작성할 필요가 없습니다.

따라서 앱에서 이 데이터를 로드하려면 이 구조를 파일 상단에 배치한 다음 사용자의 특정 국가 코드를 사용하여 URL을 구성하면 됩니다.

이 URL을 사용하여 음악 데이터 요청을 생성하고, 이미 살펴본 것과 동일한 패턴에 따라 응답을 받습니다. 응답을 받으면 JSONDecoder를 사용하여 decode 메서드에 MyGenresResponse 유형을 전달하여 데이터를 디코딩할 수 있습니다. 이것이 바로 Apple 음악 API의 임의의 URL에서 콘텐츠를 로드하는 방법입니다.


이제 개인정보 보호부터 시작하여 앱을 Apple 음악과 통합하기 위한 몇 가지 중요한 사전 단계에 대해 논의해 보겠습니다.

Apple은 사용자가 자신의 데이터에 액세스할 수 있는 앱을 계속 제어할 수 있기를 바랍니다. 따라서 사용자의 청취 기록이나 음악 라이브러리 등 Apple 음악 API에서 데이터를 요청하기 전에 앱이 Apple 음악에 액세스할 수 있도록 사용자의 사전 동의를 받아야 합니다. 이러한 사용자 콘텐츠 요청은 기기 및 앱별로 이루어져야 합니다.

위 앱은 Apple Music API를 사용하는 예시로 Apple Music에 액세스할 수 있는 권한을 요청하는 것을 볼 수 있습니다. 이 대화 상자를 통해 앱이 Apple 음악에 액세스해야 하는 이유를 사용자에게 전달해야 합니다. 이를 위해 Info.plist에서 정의해야 하는 Apple 음악에 대한 앱의 사용 설명이 이 대화 상자의 부제목으로 포함됩니다.

다음은 뮤직키트에 대한 사용자 동의를 요청하는 방법의 예시입니다. 앱에 MusicKit이 필요한 기능이 있고 이 기능에 대한 액세스를 isAuthorizedForMusicKit 상태 변수를 사용하여 게이팅하고 있다고 가정해 보겠습니다.

앱의 적절한 지점에서 MusicKit을 사용하려고 시도하기 전에 이 비동기 요청 메서드를 사용하여 Apple Music에 대한 액세스 권한을 요청할 수 있습니다. 앱이 아직 승인되지 않은 경우에만 사용자에게 메시지를 표시합니다.

요청 메서드는 상태 값을 반환하며, 해당 상태가 .authorized와 같으면 isAuthorizedForMusicKit 변수를 true로 설정할 수 있습니다.


Token management

이제 Apple 음악 API에서 데이터를 로드하는 데 필요한 토큰에 대해 간략히 설명하겠습니다. Apple 음악 API에는 기본적으로 앱을 API로 인증하는 개발자 토큰이 필요합니다.

이전에는 이 개발자 토큰을 받으려면 개발자 포털에서 MusicKit 개인 키를 생성하고, 이 키를 비공개로 유지하기 위해 자신이 관리하는 서버에 저장한 다음, 앱에서 서버에 새 개발자 토큰을 요청해야 했습니다.

하지만 이제 Swift용 MusicKit을 사용하면 앱에 대한 개발자 토큰이 자동으로 생성되므로 더 이상 이러한 걱정을 할 필요가 없습니다. 개발자 포털에 등록하여 이 새로운 자동 동작을 선택하기만 하면 됩니다.

구체적으로, 앱 ID를 등록하는 페이지에서 하단의 앱 서비스 탭을 선택하고 MusicKit 체크박스를 활성화합니다.

또한 Apple 음악 API는 개인화된 엔드포인트에 대한 사용자 토큰이 필요합니다. 새롭게 추가된 개발자 토큰과 마찬가지로 사용자 토큰도 사용자를 대신하여 자동으로 생성됩니다.


Subscription infromation

앱에서 MusicKit을 사용할 때 필요한 또 한 가지 사항은 사용자가 활성 Apple Music 구독을 하고 있는지 확인하는 방법입니다. MusicKit의 구독 정보는 사용자가 Apple Music 카탈로그에서 콘텐츠를 재생할 수 있는지, iCloud Music 라이브러리를 활성화했는지, 아직 구독이 활성화되지 않은 경우 구독자가 될 수 있는지 여부를 알려주는 세 가지 기능으로 노출됩니다. 앱의 특정 Apple Music 관련 기능에 대한 관련 기능을 확인하십시오.

예를 들어 일부 음악을 재생하기 위해 재생 버튼이 연결되어 있는 경우 사용자가 Apple Music에서 카탈로그 콘텐츠를 재생할 수 없는 경우 해당 버튼을 비활성화할 수 있습니다.

뷰에서 상태 변수를 정의하여 음악 구독을 추적할 수 있습니다. 그런 다음 음악 구독 속성 canPlayCatalogContentfalse로 설정된 경우 버튼에 비활성화 수정자를 적용하여 버튼이 비활성화된 상태로 유지되도록 할 수 있습니다.

마지막으로 task 수정자에 전달된 비동기 블록 내에서 새 구독 업데이트 스트림을 사용하여 음악 구독의 변경 사항에 대한 알림을 받을 수 있습니다.


Playback

이제 MusicKit을 사용한 재생에 대해 이야기해 보겠습니다. MusicKit은 두 가지 플레이어를 제공하는데, 이를 SystemMusicPlayerApplicationMusicPlayer라고 합니다.

소셜 미디어 앱은 시스템 음악 앱에서 재생 중인 음악을 변경하기 위해 SystemMusicPlayer를 사용하려는 반면, 피트니스 앱은 시스템 음악 앱과 완전히 독립된 재생 상태를 유지하기 위해 ApplicationMusicPlayer를 사용하는 것을 선호할 수 있습니다.

이 두 플레이어 모두 현재 재생 중인 정보를 자동으로 보고하고 원격 명령을 처리합니다. 이것이 바로 앞서 잠금 화면의 시스템 미디어 컨트롤과 긴밀하게 통합된 이유입니다.

그러나 현재 재생 중인 앱은 다르게 보고됩니다. SystemMusicPlayer를 사용하는 경우 음악 앱이 현재 재생 중인 앱으로 보고되는 반면, ApplicationMusicPlayer를 사용하는 경우 내 앱이 현재 재생 중인 앱으로 보고됩니다. 재생 대기열의 소유권도 다릅니다. SystemMusicPlayer를 사용하면 앱이 시스템 음악 앱을 원격 제어할 뿐인 반면, ApplicationMusicPlayer를 사용하면 앱이 완전히 별도의 재생 대기열을 소유하게 됩니다.

이 두 플레이어 모두 하나 이상의 항목으로 대기열을 설정하고 다음에 재생할 항목을 추가하거나 나중에 재생할 항목을 추가할 수 있습니다.

그러나 재생 대기열을 추가로 제어할 수 있는 것은 ApplicationMusicPlayer뿐이므로 중간에 항목을 삽입하거나 이전에 추가한 항목을 제거할 수 있습니다.


Subscription offer sheet

마지막으로, 사용자가 아직 Apple 음악 구독자가 아닌 경우 앱 내에서 Apple Music 무료 평가판을 시작하도록 허용하여 앱의 음악 사용자 경험을 개선하기 위해 노력한 모든 기능을 즐길 수 있도록 할 수 있습니다.

구독 제안은 '음악 재생'과 같이 앱의 기능에 더 잘 부합하도록 사용자에게 표시되는 기본 메시지를 맞춤 설정하여 구성할 수 있습니다. 또한 특정 노래, 앨범 또는 재생 목록을 강조하는 등 상황에 맞게 설정할 수도 있습니다.

또한 앱에서 구독 제안 시트를 사용하면 Apple 서비스 성능 파트너 프로그램이라는 제휴 프로그램을 통해 새로운 Apple Music 구독자를 유치한 것에 대한 보상을 받을 수 있습니다.

앱에서 문맥에 맞는 음악 구독 오퍼를 표시하려면 앞서 살펴본 것처럼 음악 구독을 추적해야 합니다. 또한 오퍼가 표시되고 있는지 여부를 추적하기 위해 또 다른 상태 변수가 필요합니다.

예를 들어 albumid를 구독 offerOptionsitemID 속성으로 전달합니다. musicSubscription에서 canBecomeSubscriberfalse로 설정되어 있을 때마다 오퍼 버튼을 비활성화합니다. 그런 다음 isShowingOffer 속성에 바인딩하고 옵션도 포함하는 musicSubscriptionOffer 수정자를 사용합니다. 마지막으로 isShowingOffer 변수를 true로 설정합니다. 이렇게 함으로써 오퍼 뷰를 띄울 수 있습니다.


참고
https://developer.apple.com/videos/play/wwdc2021/10294/
https://nyancoder.tistory.com/27

0개의 댓글