MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是啥?

Posted

技术标签:

【中文标题】MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是啥?【英文标题】:MPNowPlayingInfoCenter : What is the best way to set MPMediaItemArtwork from an Url?MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是什么? 【发布时间】:2014-07-30 14:46:35 【问题描述】:

我发现的所有设置 MPNowPlayingInfoCenter 的 MPMediaItemArtwork 的方法都是本地图像。 MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: [UIImage imageNamed:@"myimage"];

但我需要从 imageURL 设置它

目前我用这个...

    UIImage *artworkImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:self.currentTrack.imageUrl]]];

    MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: artworkImage];
    [self.payingInfoCenter setValue:albumArt forKey:MPMediaItemPropertyArtwork];

有什么想法吗?

【问题讨论】:

你是说它适用于 3 首曲目,然后崩溃?每次更改时,您是否检查过artworkImage 不是nil 对不起,它只是一个没有图像的对象......所以崩溃......我暂时使用异步块。我觉得还可以 【参考方案1】:

这是我最好的解决方案:

- (void)updateControlCenterImage:(NSURL *)imageUrl
       
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^

            NSMutableDictionary *songInfo = [NSMutableDictionary dictionary]; 
            UIImage *artworkImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]];
            if(artworkImage)
            
                MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: artworkImage];
                [songInfo setValue:albumArt forKey:MPMediaItemPropertyArtwork];
            
           MPNowPlayingInfoCenter *infoCenter = [MPNowPlayingInfoCenter defaultCenter];
          infoCenter.nowPlayingInfo = songInfo; 
    );

/!\ 如果您已经设置了 MPNowPlayingInfoCenter ,请获取它,否则所有其他值将被覆盖

【讨论】:

抱歉 - 这似乎对我不起作用。出于某种原因,我只能看到一个愚蠢的链接替换了我尚未设置的当前正在播放的视频的标题 - 并且没有任何我在您的代码示例之后引入的属性。想到为什么会发生这种情况? 对不起@MottiShneor 很久以前,但现在该项目已经开源。你可以看看github.com/whyd/openwhyd-ios 此答案中的 MPMediaItemArtwork 初始化函数已被弃用。我建议将答案更新为:[[MPMediaItemArtwork alloc] initWithBoundsSize:theImage.size requestHandler:^UIImage* _Nonnull(CGSize aSize) return theImage; ];【参考方案2】:
let mpic = MPNowPlayingInfoCenter.default()
DispatchQueue.global().async 

            if let urlString = yourUrlString, let url = URL(string:urlString)  
                if let data = try? Data.init(contentsOf: url), let image = UIImage(data: data) 

                    let artwork = MPMediaItemArtwork(boundsSize: image.size, requestHandler:  (_ size : CGSize) -> UIImage in

                        return image

                    )


                    DispatchQueue.main.async 
                        mpic.nowPlayingInfo = [
                            MPMediaItemPropertyTitle:"Title",
                            MPMediaItemPropertyArtist:"Artist",
                            MPMediaItemPropertyArtwork:artwork
                        ]
                    
                
            
        

这在 iOS 11 中对我有用,swift 4

【讨论】:

以上是关于MPNowPlayingInfoCenter:从 URL 设置 MPMediaItemArtwork 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中更新 MPNowPlayingInfoCenter?

MPNowPlayingInfoCenter - 当音频暂停时,经过的时间不断计数

MPNowPlayingInfoCenter 是不是与 AVAudioPlayer 兼容?

暂停播放时 MPNowPlayingInfoCenter 没有正确反应

MPNowPlayingInfoCenter 在音频流停止时消失

如何在 Swift 3 中正确设置 MPNowPlayingInfoCenter