2016-07-17 3 views
4

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

ответ

3

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

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

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

+0

Прохладный, я рад, что вы это нашли. Это на какое-то время замедлило меня! Я буду регистрировать отчет об ошибке здесь через секунду ... –

+0

Возвращает ли он изображение каждый раз? Это может быть неправильно? Как часто это неверно? –

+0

@JakeDobson возвращает изображение каждый раз, но сложно определить, получишь ли вы правильную песню из API.Если вы ищете название исполнителя, название и название альбома, вы можете не получить правильную песню, например (синглы, группы с именами, которые звучат как название песни/альбома другой группы и т. Д.), –

0

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

MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork]; 
UIImage *albumImage = [itemArtwork imageWithSize:cgSizeYouWant]; 
+0

Да, но это не работает для поточного content..If Я его скачал на мой телефон (личная коллекция или Apple Music скачать работы), я получаю художественное произведение, и я использую, что точный код сверху , Так что у меня нет песен Тоби Кита на моем телефоне, если я играю Red Solo Cup в приложении Apple Music и переключаюсь на свое приложение, обложка не отображается. Тем не менее, я получаю название песни, исполнителя и альбом. Я успел отобразить обложку, если я задал запрос с идентификатором магазина (найденный из Apple Music Toolbox) и начал играть, как только приложение откроется (реализовано в приложении делегата). –

+0

[Apple Music Toolbox] (https://tools.applemusic.com/en-us) не знал, как работают ссылки, но есть, если вы или кто-то еще не знакомы. –

+0

Извините @Sean, просто попадая в переполнение стека! Не могли бы вы взглянуть на мой код и комментарии выше, пожалуйста? –

1

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

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 playbackStoreID = currentItem.playbackStoreID 
      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" 
      searchURLComponents.queryItems = [ 
       URLQueryItem(name: "term", value: playbackStoreID), 
       URLQueryItem(name: "types", value: searchTypes) 
      ] 
      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 = " " 
     } 
    } 
}