Как отобразить обложку альбома потоковой музыки Apple Music?

В моем музыкальном проигрывателе, использующем новый Apple Music API (выпущен 12 мая 2016 г.) в iOS 9 (быстро, хотя в настоящее время я также знакомлюсь с Objective-C), я могу отображать информацию из потоковой песни, но не произведения искусства. Я использую платформы MediaPlayer, UIKit и StoreKit. Я успешно запросил авторизацию для AddToCloudMusicLibrary и MusicCatalogPlayback. Я успешно показываю обложки Apple Music из песен, которые я скачал из приложения Apple Music, а также из моей личной коллекции песен. Я видел других людей с проблемами по этому вопросу, без удачи ...

Просто попробую еще раз спросить людей, прежде чем я прибегну к отображению изображения по умолчанию (которое в любом случае необходимо для обработки ошибок), или извлекаю из альтернативного сервиса. Любая помощь будет отличной! На самом деле в моем коде нет ошибки, поэтому я ее не покажу, если только не попросить помочь решить эту проблему.

Моя первая попытка размещения кода ... Вот что у меня есть в быстром файле под названием Авторизация. Нужно ли ссылаться на этот код где-нибудь или он должен быть в файле AppDelegate? Это единственная часть моего проекта, в которой я не уверен на 100%.

import StoreKit
import MediaPlayer
import UIKit

class AppleMusicPlayer: NSObject {

    let applePlayer = MPMusicPlayerController.systemMusicPlayer()

    func playID(productID: String) {
        SKCloudServiceController.requestAuthorization { status in
            let controller = SKCloudServiceController()
            controller.requestCapabilitiesWithCompletionHandler { capabilities, error in
                if capabilities != SKCloudServiceCapability.None {
                    MPMediaLibrary.defaultMediaLibrary().addItemWithProductID(productID) { entities, error in
                        self.appPlayer.setQueueWithStoreIDs([productID])
                        self.appPlayer.shuffleMode = .Songs
                        self.appPlayer.play()
                    }
                }
            }
        }
    }
}

Ответы на вопрос(4)

Решение Вопроса

песни, которые не находятся в библиотеке пользователя, но вместо этого передаются из AM, не вернут обложку альбома.

Вы должны подать улучшение функции на bugreport.apple.com (вы также можете обмануть мою с 6 месяцев назад 25413082).

В то же время лучше всего использовать iTunes API для получения обложки альбома, к сожалению, это не дает правильных результатов в 100% случаев ...

 Jake Dobson24 авг. 2016 г., 03:14
Возвращает ли оно изображение каждый раз? Это может быть не правильно? Как часто это неверно?
 Jake Dobson24 авг. 2016 г., 02:36
Круто, я рад, что ты нашел это. Это действительно замедлило меня на некоторое время! Я буду регистрировать отчет об ошибке здесь через секунду ...
 Jordi Bruin25 авг. 2016 г., 11:23
@JakeDobson каждый раз возвращает изображение, но трудно определить, получаете ли вы правильную песню из API. Если вы ищете исполнителя, название и название альбома, вы можете не получить нужную песню, например (синглы, группы с названиями, которые звучат как название песни / альбома другой группы и т. Д.)

Внутри класса MediaItem есть свойство с именемMPMediaItemPropertyArtwork, Вы сможете получить обложку для альбома следующим образом:

MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];
UIImage *albumImage = [itemArtwork imageWithSize:cgSizeYouWant];
 Jake Dobson18 июл. 2016 г., 05:17
Apple Music Toolbox Я не был уверен, как работают ссылки, но есть что, если вы или кто-то, не знакомы.
 Jake Dobson18 июл. 2016 г., 06:17
Извините @Sean, просто попал в стек переполнения! Не могли бы вы взглянуть на мой код и комментарии выше, пожалуйста?
 Jake Dobson18 июл. 2016 г., 04:55
Да, но он не работает для потокового контента. Если он загружен на мой телефон (работает личная коллекция или загрузка музыки Apple), я получаю обложку и использую этот точный код сверху. Так что на моем телефоне нет песен Тоби Кейта, если я играю в Red Solo Cup в приложении Apple Music и переключаюсь на свое приложение, изображение не отображается. Однако я получу название песни, исполнителя и альбом. Я успешно отобразил иллюстрацию, если я установил запрос с идентификатором магазина (найденный из Apple Music Toolbox) и начал играть, как только приложение открывалось (реализовано в делегате приложения).

либо было настоящей ошибкой, я не уверен, однако вы не можете установитьUIImageView кnowPlayingItem как то, что вы могли ожидать. Вы должны вытащить изображение из API сервиса Apple Music. Смотрите документациюВот, Также посмотрите на пример проектаВот что Apple обеспечивает полное понимание. ТакжеВот это полный пример того, как я преодолел эту проблему.

func updateUserInterface() {
    if musicPlayerManager.musicPlayerController.playbackState == .playing { //Check if anything is playing
        if let currentItem = musicPlayerManager.musicPlayerController.nowPlayingItem {
            songAlbumLabel.text = currentItem.albumTitle
            songTitleLabel.text = currentItem.title
            songArtistNameLabel.text = currentItem.artist
            let albumTitle = currentItem.albumTitle  //Changes here!
            let artist = currentItem.artist  //Changes here!
            if let artwork = musicPlayerManager.musicPlayerController.nowPlayingItem?.artwork, let image = artwork.image(at: artworkImageView.frame.size) { // Check for local image
                print("using local image")
                artworkImageView.image = image 
        } else { 
            guard let developerToken = appleMusicManager.fetchDeveloperToken() else {print("oops");return}
            let searchTypes = "songs"
            var searchURLComponents = URLComponents()
            searchURLComponents.scheme = "https"
            searchURLComponents.host = "api.music.apple.com"
            searchURLComponents.path = "/v1/catalog/"
            searchURLComponents.path += "\(authorizationManager.cloudServiceStoreFrontCountryCode)"
            searchURLComponents.path += "/search"
            let expectedArtist = artist?.replacingOccurrences(of: " ", with: "+")  //Changes here!
            let artistExpected = expectedArtist?.replacingOccurrences(of: "&", with: "")  //Changes here!
            let expectingArtist = artistExpected?.replacingOccurrences(of: "++", with: "+")  //Changes here!
            let expectedAlbum = albumTitle?.replacingOccurrences(of: " ", with: "+")  //Changes here!
            searchURLComponents.queryItems = [
                    URLQueryItem(name: "term", value: (expectingArtist! + "-" + expectedAlbum!)),
                    URLQueryItem(name: "types", value: searchTypes)
                ]  //Changes here!
            var request = URLRequest(url: searchURLComponents.url!)
            request.httpMethod = "GET"
            request.addValue("Bearer \(developerToken)", forHTTPHeaderField: "Authorization")
            let dataTask = URLSession.shared.dataTask(with: request) {
                (data, response, error) in
                print(response!)
                if let searchData = data {
                    guard let results = try? self.appleMusicManager.processMediaItemSections(searchData) else { return}
                    self.mediaItem = results
                    let album = self.mediaItem[0][0]
                    let albumArtworkURL = album.artwork.imageUrl(self.artworkImageView.frame.size)
                    if let image = self.imageManager.cachedImage(url: albumArtworkURL) {
                        print("using cached image")
                        self.artworkImageView.image = image
                    }
                    else {
                        self.imageManager.fetchImage(url: albumArtworkURL) {(image) in
                            print("fetching image")
                            self.artworkImageView.image = image
                        }
                    }
                }
            }
            dataTask.resume()
        }
    } else { // Need to set it to some kind of default values
        artworkImageView.image = nil
        songArtistNameLabel.text = " "
        songTitleLabel.text = " "
        songAlbumLabel.text = " "
        }
    }
}
 CarpenterBlood06 июл. 2018 г., 12:32
Я обновил свой ответ, чтобы отразить изменения в Apple Music API. Вы уверены, что ваш токен разработчика действителен? Получаете ли вы код статуса 200? Если нет, то это проблема. Смотрите мой обновленный пример Github.
 Foti Dim22 июн. 2018 г., 12:43
Добавил мой токен разработчика, но у меня не работает.

который я нашел, это использовать песню get из каталога Apple Music API request,задокументировано здесь.

Вам просто нужно передать идентификатор песни (тот, который используется для воспроизведения) и идентификатор магазина, который используется для воспроизведения песни. Это всегда может привести к точному результату по сравнению с ответом, который использует поисковый запрос, который может потерпеть неудачу.

Ваш ответ на вопрос