Hi all,
I am trying to start the playback of the current queue in the system music player using:
let player = SystemMusicPlayer.shared
try await player.play()
But there is no playback, what am I doing wrong? Please keep in mind that there are already songs in the queue. I am simply unable start the playback.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello everyone,
I am trying to understand how to decode the JSON response returned by the suggestions/top results endpoint in MusicKit
As you can see the response returns suggestions, which has two different types, Albums and Songs within the same 'suggestions' array. How can I decode the response even if there are different types using a single struct?
{
"results" : {
"suggestions" : [
{
"content" : {
"attributes" : {
"url" : "https:\/\/music.apple.com\/us\/artist\/megan-thee-stallion\/1258989914",
"name" : "Megan Thee Stallion",
"genreNames" : [
"Hip-Hop\/Rap"
]
},
"id" : "1258989914",
"relationships" : {
"albums" : {
"data" : [
{
"href" : "\/v1\/catalog\/us\/albums\/1537889223",
"type" : "albums",
"id" : "1537889223"
}
],
"next" : "\/v1\/catalog\/us\/artists\/1258989914\/albums?offset=25",
"href" : "\/v1\/catalog\/us\/artists\/1258989914\/albums"
}
},
"href" : "\/v1\/catalog\/us\/artists\/1258989914",
"type" : "artists"
},
"kind" : "topResults"
},
{
"content" : {
"href" : "\/v1\/catalog\/us\/artists\/991187319",
"attributes" : {
"genreNames" : [
"Hip-Hop\/Rap"
],
"url" : "https:\/\/music.apple.com\/us\/artist\/moneybagg-yo\/991187319",
"name" : "Moneybagg Yo"
},
"id" : "991187319",
"type" : "artists",
"relationships" : {
"albums" : {
"href" : "\/v1\/catalog\/us\/artists\/991187319\/albums",
"data" : [
{
"id" : "1550876571",
"href" : "\/v1\/catalog\/us\/albums\/1550876571",
"type" : "albums"
}
],
"next" : "\/v1\/catalog\/us\/artists\/991187319\/albums?offset=25"
}
}
},
"kind" : "topResults"
}
]
}
}
I am trying to display albums, playlists and artist for a Genre.
Does anyone know how to do this or if this is not currently supported by the MusicKit and Apple Music API?
Hello,
I am wondering how one can play music videos (with the actual video playing) with the ApplicationMusicPlayer using MusicKit for Swift?
There is not much documentation on this, so any help would be appreciated.
Topic:
Media Technologies
SubTopic:
General
Tags:
MusicKit
Apple Music API
wwdc21-10291
wwdc21-10293
Hi all,
I ma displaying the Music Subscription offer sheet in my app. Shortly after the sheet is presented, when the user dismisses the offer, the app crashes with error:
Fatal error: CloudServiceSetupView.makeUIViewController() was called with an unexpected presentation state: idle.
2021-11-30 11:56:28.974626-0800 AppName[16276:4525658] _MusicKit_SwiftUI/CloudServiceSetupView.swift:31: Fatal error: CloudServiceSetupView.makeUIViewController() was called with an unexpected presentation state: idle.
What am I doing wrong?
Related Ticket for Apple Engineers: FB9789040
Hi Apple Engineers,
In my app Caset, the album artwork is no longer displaying correctly, instead the console is printing with error:
[Artwork] [MPArtwork] Failed to create directory at 'file:///var/mobile/Media/iTunes_Control/iTunes/Artwork/Caches/96x96/61/' with error: Error Domain=NSCocoaErrorDomain Code=513 "You don’t have permission to save the file “61” in the folder “96x96”." UserInfo={NSFilePath=/var/mobile/Media/iTunes_Control/iTunes/Artwork/Caches/96x96/61, NSUnderlyingError=0x280552dc0 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}
Here is the code I am using to display the album artwork of the current item:
@ObservedObject private var playerQueue = ApplicationMusicPlayer.shared.queue
//In the BODY
switch playerQueue.currentEntry?.item {
case .song(let song):
if let artwork = song.artwork {
ArtworkImage(artwork, width: 40, height: 40)
}
case .musicVideo(let video):
if let artwork = video.artwork {
ArtworkImage(artwork, width: 70, height: 40)
}
case nil:
EmptyView()
}
Related bug has been filed here: FB10189431
This unexpected behavior is new and was previously worked as expected in early versions of iOS 15.
Hello,
I am fetching and displaying the .fullalbums for an Artist through the MusicKit api.
The JSON response returned has a hasNextBatch: true value, but I am unsure how to fetch and display the next batch.
Is this something that can be intelligently retrieved though some MusicKit functionality or does one have to perform another data request to fetch the next batch?
Hi all,
I am trying to implement the communication notification for me app. But the avatar does not show and there is virtually no difference from a normal notification.
I also added the Communication Notification capability, and in my Notification Service Extension's Info.plist, added this: NSExtension → NSExtensionAttributes (dictionary) → IntentsSupported (array) → INSendMessageIntent (string)
What am I doing wrong?
Here is my code:
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
var personNameComponents = PersonNameComponents()
personNameComponents.nickname = "Sender Name"
let avatar = INImage(named: "Cover")
let senderPerson = INPerson(personHandle: INPersonHandle(value: "1233211234", type: .unknown), nameComponents: personNameComponents, displayName: "Sender Name", image: avatar, contactIdentifier: nil, customIdentifier: nil, isMe: false, suggestionType: .none)
let mePerson = INPerson( personHandle: INPersonHandle(value: "1233211232", type: .unknown), nameComponents: nil, displayName: nil, image: nil, contactIdentifier: nil, customIdentifier: nil, isMe: true, suggestionType: .none)
let incomingMessagingIntent = INSendMessageIntent(recipients: [mePerson], outgoingMessageType: .outgoingMessageText, content: "Test DUde", speakableGroupName: nil, conversationIdentifier: "uid", serviceName: "caset", sender: senderPerson, attachments: [])
incomingMessagingIntent.setImage(avatar, forParameterNamed: \.sender)
let interaction = INInteraction(intent: incomingMessagingIntent, response: nil)
interaction.direction = .incoming
do {
let newContent = try request.content.updating(from: incomingMessagingIntent)
contentHandler(newContent)
} catch {
print(error)
}
}
override func serviceExtensionTimeWillExpire() {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Hi all,
I am trying to display the name of the group in the subtitle of the communication notification, like this:
Here is my code:
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
var personNameComponents = PersonNameComponents()
personNameComponents.nickname = "Test Person"
let avatar = INImage(url: URL(string: "https:imageURL")!)
let senderPerson = INPerson(personHandle: INPersonHandle(value: "1233211234", type: .unknown), nameComponents: personNameComponents, displayName: "Test Person", image: avatar, contactIdentifier: nil, customIdentifier: nil, isMe: false, suggestionType: .none)
let mePerson = INPerson( personHandle: INPersonHandle(value: "1233211232", type: .unknown), nameComponents: nil, displayName: nil, image: nil, contactIdentifier: nil, customIdentifier: nil, isMe: true, suggestionType: .none)
let incomingMessagingIntent = INSendMessageIntent(recipients: [mePerson], outgoingMessageType: .unknown, content: "Test", speakableGroupName: INSpeakableString(spokenPhrase: "Test Group"), conversationIdentifier: "Test Group", serviceName: "Test", sender: senderPerson, attachments: nil)
incomingMessagingIntent.setImage(avatar, forParameterNamed: \.sender)
let interaction = INInteraction(intent: incomingMessagingIntent, response: nil)
interaction.direction = .incoming
do {
let newContent = try request.content.updating(from: incomingMessagingIntent) as! UNMutableNotificationContent
contentHandler(newContent)
} catch {
print(error)
}
}
I also have tried:
Setting the subtitle of the UNMutableNotificationContent
Including the subtitle field in the aps remote notification payload
When I display the notification as a normal notification the subtitle is displayed as usual. What am I doing incorrectly?
Hi all,
I am playing songs via ApplicationMusicPlayer with MusicKit for Swift and I am running into an issue where shuffle mode is sometimes automatically turned on. Even though there was no code related to shuffle mode.
Here's a snippet
//myQueue is an array of Tracks
let player = ApplicationMusicPlayer.shared
player.queue = ApplicationMusicPlayer.Queue(for: myQueue)
// player.state.shuffleMode = .off
// I tried explicitly setting shuffle mode off, which has no effect
try await player.play()
This issue is not easily reproducible, it occurs rarely and at random. But once this issue occurs it persists even after uninstalling and reinstalling the app. When I tried it to reproduce it with another device and everything works properly.
Anyone else running into this issue?
For Apple Engineers, here is the ticket: FB9816030
Hello,
In MusicKit I would like to know how I can detect the end of hasNextBatch for a MusicItemCollection.
Let's say, I have a playlist with 100+ songs in my library.
Initially, I get 100 songs from the response and hasNextBatch is true.
If I use a while loop, every response includes the hasNextBatch = true. So I do not know when to stop or how many limited loop to make.
Is there way I can get the playlist loaded completely with all the songs loaded using nextBatch and stop when I have hit the end?
Hi all,
I am curious about how we can use MusicKit for Swift to SharePlay music?
There seems to be very little documentation around this as most of it seems top be focused on AVPlayerPlaybackCoordinator.
Is there an easier way to directly integrate ApplicationMusicPlayer with GroupActivity?
Topic:
Media Technologies
SubTopic:
General
Tags:
MusicKit
wwdc2022-10139
wwdc2022-10140
wwdc2022-110380
Hey everyone,
I had a sample app I was working on with the first beta which had SharePlay/Group Activity working fine.
Beta 2 seems to have broken it. It doesn't trigger any activity. I even tried deleting and reinstalling the app, but that doesn't seem to fix the issue either.
Console error print:
Dropping activity as there is no active conversation
Any ideas how to fix this issue?
Is there a way to to send notifications based on a participants activity?
Like in the Keynote, Apple included example for Music app where a participant adds songs to a shared queue and all other users get a notification about the activity.
Topic:
App & System Services
SubTopic:
General
Tags:
Group Activities
wwdc21-10183
wwdc21-10184
wwdc21-10187
Hey everyone,
I am creating playlist via the MusicKit API and by default it creates the playlist in the users library and the isPublic attribute is set to false.
Is there a way to make the playlist public at the time of creation?
(Only way to change isPublic = true at this time seems to be through the Music app right now)
Topic:
Media Technologies
SubTopic:
General
Tags:
MusicKit
Apple Music API
wwdc21-10291
wwdc21-10294