MPNowPlayingInfoCenter: каков наилучший способ установить MPMediaItemArtwork из URL-адреса?
Все методы, которые я нашел для установки MPMediaItemArtwork объекта MPNowPlayingInfoCenter, работают с локальными изображениями. 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 ответа
Это мое лучшее решение:
- (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
, получите его или все другие значения будут переопределены
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
Вот функция, которая настраивает сеанс мультимедиа с изображением на экране блокировки и в центре управления:
(Этот код был модифицированной версией ответа @NickDK )
func setupNowPlaying(title: String, albumArtwork: String, artist:String, isExplicit: Bool, rate: Float, duration: Any) {
let url = URL.init(string: albumArtwork)!
let mpic = MPNowPlayingInfoCenter.default()
DispatchQueue.global().async {
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,
MPMediaItemPropertyIsExplicit: isExplicit,
MPNowPlayingInfoPropertyPlaybackRate: soundManager.audioPlayer?.rate ?? 0,
MPMediaItemPropertyPlaybackDuration: CMTimeGetSeconds(soundManager.audioPlayer?.currentItem?.asset.duration ?? CMTime(seconds: 0, preferredTimescale: 0))
]
}
}
}
}
Использование:
setupNowPlaying(
title: "Pull up at the mansion",
albumArtwork: "https://static.wixstatic.com/media/89b4e7_5f29de0db68c4d888065b0f03d393050~mv2.png/v1/fill/w_512,h_512/ImageTitle.png",
artist: "DJ bon26",
isExplicit: true
)
Полное использование:
import MediaPlayer
class SoundManager : ObservableObject {
var audioPlayer: AVPlayer?
func playSound(sound: String){
if let url = URL(string: sound) {
self.audioPlayer = AVPlayer(url: url)
}
}
}
struct ContentView: View {
@State var song1 = false
@StateObject private var soundManager = SoundManager()
var body: some View {
Image(systemName: song1 ? "pause.circle.fill": "play.circle.fill")
.font(.system(size: 25))
.padding(.trailing)
.onTapGesture {
playSound(
url: "https://static.wixstatic.com/mp3/0fd70b_8d4e15117ff0458792a6a901c6dddc6b.mp3",
title: "Pull up at the mansion",
albumArtwork: "https://static.wixstatic.com/media/89b4e7_5f29de0db68c4d888065b0f03d393050~mv2.png/v1/fill/w_512,h_512/ImageTitle.png",
artist: "DJ bon26",
isExplicit: true
)
}
}
func playSound(url: String, title: String, albumArtwork: String, artist: String, isExplicit: Bool) {
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options:
.init(rawValue: 0))
try AVAudioSession.sharedInstance().setActive(true)
soundManager.playSound(sound: url)
song1.toggle()
if song1{
soundManager.audioPlayer?.play()
setupNowPlaying(
title: title,
albumArtwork: albumArtwork,
artist: artist,
isExplicit: isExplicit
)
UIApplication.shared.beginReceivingRemoteControlEvents()
MPNowPlayingInfoCenter.default().playbackState = .playing
} else {
soundManager.audioPlayer?.pause()
}
}catch{
print("Something came up")
}
}
}
Я считаю, что это очень полезно,
Брендан Окей-Ивоби