2021 Audio & Video
WWDC21 · 18 min · Audio & Video
Meet MusicKit for Swift
MusicKit makes it easy to integrate Apple Music into your app. Explore the Swift-based framework: We’ll take you through the basic process of using MusicKit — including how to find, request, and play content — and show you how you can incorporate music subscription workflows into your app if someone hasn’t yet signed up to Apple Music.
Watch at developer.apple.com ↗Code shown on screen · 6 snippets
Loading and accessing relationships
// Loading and accessing relationships
let detailedAlbum = try await album.with([.artists, .tracks, .relatedAlbums])
print("\(detailedAlbum)")
if let tracks = detailedAlbum.tracks {
print(" Tracks:")
tracks.prefix(2).forEach { track in
print(" \(track)")
}
} Loading and accessing associations
// Loading and accessing associations
let detailedAlbum = try await album.with([.artists, .tracks, .relatedAlbums])
print("\(detailedAlbum)")
if let relatedAlbums = detailedAlbum.relatedAlbums {
print(" \(relatedAlbums.title ?? ""):")
relatedAlbums.prefix(2).forEach { relatedAlbum in
print(" \(relatedAlbum)")
}
} Loading top level genres
// Loading top level genres
struct MyGenresResponse: Decodable {
let data: [Genre]
}
let countryCode = try await MusicDataRequest.currentCountryCode
let url = URL(string: "https://api.music.apple.com/v1/catalog/\(countryCode)/genres")!
let dataRequest = MusicDataRequest(urlRequest: URLRequest(url: url))
let dataResponse = try await dataRequest.response()
let decoder = JSONDecoder()
let genresResponse = try decoder.decode(MyGenresResponse.self, from: dataResponse.data)
print("\(genresResponse.data[9])") Requesting user consent for MusicKit
// Requesting user consent for MusicKit
var isAuthorizedForMusicKit = false
func requestMusicAuthorization() {
detach {
let authorizationStatus = await MusicAuthorization.request()
if authorizationStatus == .authorized {
isAuthorizedForMusicKit = true
} else {
// User denied permission.
}
}
} Using music subscription to drive state of a play button
// Using music subscription to drive state of a play button
var musicSubscription: MusicSubscription?
var body: some View {
Button(action: handlePlayButtonSelected) {
Image(systemName: "play.fill")
}
.disabled(!(musicSubscription?.canPlayCatalogContent ?? false))
.task {
for await subscription in MusicSubscription.subscriptionUpdates {
musicSubscription = subscription
}
}
} Showing contextual music subscription offer
// Showing contextual music subscription offer
var musicSubscription: MusicSubscription?
var isShowingOffer = false
var offerOptions: MusicSubscriptionOffer.Options {
var offerOptions = MusicSubscriptionOffer.Options()
offerOptions.itemID = album.id
return offerOptions
}
var body: some View {
Button("Show Subscription Offers", action: showSubscriptionOffer)
.disabled(!(musicSubscription?.canBecomeSubscriber ?? false))
.musicSubscriptionOffer(isPresented: $isShowingOffer, options: offerOptions)
}
func showSubscriptionOffer() {
isShowingOffer = true
} Resources
Related sessions
-
26 min -
23 min -
15 min -
8 min