2014-11-03 7 views
8

С iOS 8 все массивы данных для обложек альбомов от iPad & Устройства iPhone возвращают нулевой массив. Я могу получить обложку альбома или обложку при выводе из локального файла (NSBundle), но любые песни, приобретенные в iTunes или на самом устройстве, возвращаются пустым.Обложка обложки обложки iOS 8

Я обновил до последней версии XCode, последней версии iOS на обоих устройствах, а также iTunes. Я тестировал iPad 4, iPad Air, iPhone 5, iPhone 6. Надеюсь, кто-то знает, что происходит, похоже, это известная ошибка в iOS 8 прямо сейчас. Кроме того, я могу играть в актив и извлекать вещи, такие как имя песни и исполнителя.

MPMediaQuery *songQuery = [MPMediaQuery songsQuery]; 
NSArray *itemsFromGenericQuery = [songQuery items]; 
NSMutableArray *songsList = [[NSMutableArray alloc] initWithArray:itemsFromGenericQuery]; 
MPMediaItem *mediaItem = (MPMediaItem *)[songsList objectAtIndex:0]; 

NSURL *url = [mediaItem valueForProperty:MPMediaItemPropertyAssetURL]; 
AVAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil]; 
NSArray *commonArray = [assets commonMetadata]; 

//Test A 
NSArray *albumArray = [AVMetadataItem metadataItemsFromArray:commonArray filteredByIdentifier:AVMetadataIdentifieriTunesMetadataCoverArt]; 
NSLog(@"commonArray = %lu",(unsigned long)[commonArray count]); //Returns 3 
NSLog(@"albumArray has %lu",(unsigned long)[albumArray count]); //Returns 0 or null 

//Test B 
for (AVMetadataItem *metadataItem in asset.commonMetadata) { 

    if ([metadataItem.commonKey isEqualToString:@"artwork"]){ 
     NSDictionary *imageDataDictionary = (NSDictionary *)metadataItem.value; 
     NSData *imageData = [imageDataDictionary objectForKey:@"data"]; 
     UIImage *image = [UIImage imageWithData:imageData]; 
     coverArtImage.image = image; 
    } 
} 

//Test C 
for (AVMetadataItem *item in commonArray) { 

    if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { 
     NSData *newImage = [item.value copyWithZone:nil]; 
     coverArtImage.image = [UIImage imageWithData:newImage]; 
    } 

} 

//Test D 
for (AVMetadataItem *item in asset.metadata) { 

    if ([item.commonKey isEqualToString:@"artwork"]){ 
     NSDictionary *imageDataDictionary = (NSDictionary *)item.value; 
     NSData *imageData = [imageDataDictionary objectForKey:@"data"]; 
     UIImage *image = [UIImage imageWithData:imageData]; 
     coverArtImage.image = image; 
    } 

    if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) { 
     NSData *newImage = [item.value copyWithZone:nil]; 
     coverArtImage.image = [UIImage imageWithData:newImage]; 
    } 

} 

Все изображения обложки возвращаются или не вызываются. Кроме того, вытаскивание обложки из прямого файла, предложенное яблоком, является асинхронным, но, кажется, занимает не менее 10 секунд независимо от того, на каком устройстве я его пробовал. iOS 7 позволил нам напрямую вытащить обложку из mediaItem, и это было мгновенно, я не понимаю, почему они будут использовать эту функцию.

+0

Дальше вы здесь? – newenglander

+0

Вы пробовали MPMediaQuery.songsQuery()? – Aabglov

ответ

0

Я рекомендую попробовать новый Swift реализации:

let query = MPMediaQuery.songsQuery() 
let mediaCollection = MPMediaItemCollection(items: query.items!) 
print(mediaCollection.items) 

Это должно вернуть непустой массив для физического устройства с песнями загруженными.

1
NSString *queryString = [url query]; 
if (queryString == nil) // shouldn't happen 
    return nil; 

NSArray *components = [queryString componentsSeparatedByString:@"="]; 
if ([components count] < 2) // also shouldn't happen 
    return nil; 

id trackId = [components objectAtIndex:1]; 

MPMediaQuery *query = [[MPMediaQuery alloc] init]; 
[query addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:trackId forProperty:MPMediaItemPropertyPersistentID]]; 

NSArray *items = [query items]; 

[query release]; 

if ([items count] < 1) // still shouldn't happen 
    return nil; 

MPMediaItem* mpitem= [items objectAtIndex:0]; 

MPMediaItemArtwork* mpArt = [mpitem valueForProperty:MPMediaItemPropertyArtwork]; 

UIImage* mpImage = [mpArt imageWithSize:mpArt.bounds.size]; 
+0

Пожалуйста, добавьте некоторое объяснение в свой ответ! –