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")
        }
    }
}

Я считаю, что это очень полезно,

Брендан Окей-Ивоби

Другие вопросы по тегам