首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何展示苹果流媒体音乐的专辑艺术作品?

如何展示苹果流媒体音乐的专辑艺术作品?
EN

Stack Overflow用户
提问于 2016-07-17 00:14:40
回答 4查看 3.1K关注 0票数 5

在我的音乐播放器使用新的苹果音乐API(2016年5月12日发布)在iOS 9(斯威夫特,虽然我目前正在熟悉的目标-C以及),我可以显示的信息,从一首流媒体歌曲,但不是艺术品。我正在使用MediaPlayer、UIKit和StoreKit框架。我成功地请求了AddToCloudMusicLibrary和MusicCatalogPlayback的授权。我成功地展示了我从Apple应用程序下载的歌曲中的苹果音乐艺术作品,以及我个人歌曲收藏中的艺术品。我见过其他人在这件事上有问题,没有运气.

在我求助于显示默认图像(对于错误处理来说无论如何都是必要的)或从备用服务中提取之前,我只想再问一次,询问人员。任何帮助都会很好!在我的代码中不是一个真正的错误,所以我不会显示它,除非被要求帮助解决这个问题。

我第一次尝试发布code...Here是在一个名为“授权”的快速文件中。我需要在任何地方引用这段代码吗?还是应该在AppDelegate文件中呢?这是我的项目的唯一一部分,我不能百分之百肯定。

代码语言:javascript
复制
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()
                    }
                }
            }
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-22 22:59:55

这是当前Apple中的一个bug。正如您所提到的,不是在用户库中,而是从AM流的歌曲将不会返回专辑艺术作品。

您应该在bugreport.apple.com上提交一个特性增强文件(您还可以在25413082之前的6个月前对我的功能进行改进)。

同时,您最好的选择是使用iTunes api检索相册艺术作品,不幸的是,这不能100%地返回正确的结果.

票数 5
EN

Stack Overflow用户

发布于 2017-07-11 14:52:37

我为此挣扎了很长一段时间。如果这是一个实际的bug,我不确定,但是您不能像您所期望的那样将UIImageView设置为nowPlayingItem。您必须从Apple服务api中提取图像。请参阅文档这里。还请看一下苹果提供的这里示例项目,以使其得到充分的理解。另外,这里是我如何克服这个问题的完整示例。

代码语言:javascript
复制
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 = " "
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-07-17 01:47:24

MPMediaItemPropertyArtwork.类中有一个名为MediaItem的属性您将能够以下列方式检索该专辑的艺术品:

代码语言:javascript
复制
MPMediaItemArtwork *artwork = [mediaItem valueForProperty:MPMediaItemPropertyArtwork];
UIImage *albumImage = [itemArtwork imageWithSize:cgSizeYouWant];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38416781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档