2014-11-03 85 views
8

自iOS 8以来,所有iPad专用艺术数据阵列& iPhone设备都会返回一个空数组。从本地文件(NSBundle)拉出时,我可以获得专辑封面或封面艺术,但是从iTunes或设备上购买的任何歌曲都会返回空白。iOS 8专辑封面

我已经更新到最新的XCode,这两个设备,并且还有在iTunes上最新的iOS。我已经在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]; 
    } 

} 

所有封面图片返回null或永远不会被调用。此外,从苹果建议的直接文件中提取封面图片是异步的,但无论使用什么设备,似乎至少需要10秒。 iOS 7允许我们直接从mediaItem中拉出封面,这是瞬间的,我不明白他们为什么会削弱这个功能。

+0

你得到任何进一步这里? – newenglander 2015-01-29 07:45:04

+0

你有没有试过MPMediaQuery.songsQuery()? – Aabglov 2015-10-07 01:43:28

回答

0

我会建议您尝试新雨燕的实现:

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

请给你的答案添加一些解释! – 2015-10-08 10:57:00