如何显示流媒体Apple Music的专辑封面?

在我的音乐播放器中使用iOS 9中的新Apple Music API(2016年5月12日发布)(很快,虽然我现在也熟悉Objective-C),但我可以显示来自流媒体歌曲的信息,但不是艺术品。 我正在使用MediaPlayer,UIKit和StoreKit框架。 我成功申请了AddToCloudMusicLibrary和MusicCatalogPlayback的授权。 我成功地从Apple Music应用程序下载的歌曲中显示Apple Music图稿,以及我个人歌曲集中的艺术作品。 我见过其他有问题的人,没有运气……

在我求助于显示默认图像(无论如何需要进行error handling)或从备用服务中提取之前,只是再尝试再问一次。 任何帮助都会很棒! 在我的代码中并不是真的错误所以我不会显示它,除非请求帮助解决这个问题。

我第一次尝试发布代码……这就是我在一个名为Authorization的swift文件中所拥有的。 我是否需要在任何地方引用此代码,或者它应该在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() } } } } } } 

这是Apple Music当前API中的一个错误。 如您所述,不在用户库中但从AM流式传输的歌曲不会返回专辑封面。

你应该在bugreport.apple.com上提交一个function增强function(你也可以从6个月前的25413082开始)。

在此期间,您最好的选择是使用iTunes api检索专辑图片,遗憾的是,这并没有100%的时间返回正确的结果…

在MediaItem类中,有一个名为MPMediaItemPropertyArtwork的属性。 您将能够以下列方式检索相册的艺术作品:

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

我挣扎了很长一段时间。 如果这是一个实际的错误,我不确定,但你不能像你期望的那样将UIImageView设置为nowPlayingItem 。 您必须从Apple Music服务API中提取图像。 请参阅此处的文档 另请参阅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 = " " } } } 

我找到的最好的方法是使用目录Apple Music API请求中的获取歌曲, 在此处记录 。

您只需要传入歌曲标识符(用于播放的标识符)和用于播放歌曲的店面标识符。 与使用可能失败的搜索请求的anwer相比,这总是可以产生准确的结果。