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];

Есть идеи?


person Damien Romito    schedule 09.06.2014    source источник
comment
Вы хотите сказать, что он работает на 3 треках, а затем вылетает? Проверяли ли вы, что artworkImage не является nil при каждом изменении?   -  person sooper    schedule 10.06.2014
comment
Извините, это был просто объект без изображения... так что крах... Сейчас я использую асинхронный блок. я думаю все в порядке   -  person Damien Romito    schedule 10.06.2014


Ответы (2)


Это мое лучшее решение:

- (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 , получите его, иначе все остальные значения будут переопределены

person Damien Romito    schedule 16.03.2015
comment
Извините - это, кажется, не работает для меня. По какой-то причине я вижу только одну глупую ссылку, заменяющую название воспроизводимого в данный момент видео, которое я не установил, и ничего из атрибутов, которые я ввел, следуя вашему примеру кода. Идеи, почему это могло произойти? - person Motti Shneor; 09.07.2017
comment
Извините, @MottiShneor, это было давно, но теперь проект открыт. Вы можете взглянуть на github.com/whyd/openwhyd-ios. - person Damien Romito; 12.07.2017
comment
Функция инициализации MPMediaItemArtwork в этом ответе устарела. Я бы предложил обновить ответ примерно так: [[MPMediaItemArtwork alloc] initWithBoundsSize:theImage.size requestHandler:^UIImage* _Nonnull(CGSize aSize) { return theImage; }]; - person Shackleford; 28.07.2017

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

person NickDK    schedule 24.10.2017