Ios8 iOS 8专辑封面

Ios8 iOS 8专辑封面,ios8,cover,avasset,albumart,Ios8,Cover,Avasset,Albumart,从iOS 8开始,来自iPad和iPhone设备的唱片集艺术的所有数据数组都返回空数组。我可以从本地文件(NSBundle)获取唱片集艺术或封面艺术,但从iTunes或设备本身购买的任何歌曲都返回空 我已经更新到最新的XCode,两款设备上的最新iOS,还有iTunes。我在iPad4、iPadAir、iPhone5和iPhone6上进行了测试。希望有人知道发生了什么,这似乎是一个已知的错误在iOS 8现在。此外,我还可以播放资产,并检索歌曲名称和艺术家等内容 MPMediaQuery*song

从iOS 8开始,来自iPad和iPhone设备的唱片集艺术的所有数据数组都返回空数组。我可以从本地文件(NSBundle)获取唱片集艺术或封面艺术,但从iTunes或设备本身购买的任何歌曲都返回空

我已经更新到最新的XCode,两款设备上的最新iOS,还有iTunes。我在iPad4、iPadAir、iPhone5和iPhone6上进行了测试。希望有人知道发生了什么,这似乎是一个已知的错误在iOS 8现在。此外,我还可以播放资产,并检索歌曲名称和艺术家等内容

MPMediaQuery*songQuery=[MPMediaQuery-songsQuery];
NSArray*itemsFromGenericQuery=[songQuery项];
NSMutableArray*songsList=[[NSMutableArray alloc]initWithArray:itemsFromGenericQuery];
MPMediaItem*mediaItem=(MPMediaItem*)[songsList对象索引:0];
NSURL*url=[mediaItem valueForProperty:MPMediaItemPropertyAsetUrl];
AVAsset*asset=[[AVURLAsset alloc]initWithURL:url选项:nil];
NSArray*commonArray=[assets commonMetadata];
//测试A
NSArray*albumArray=[AVMetadataItem metadataItemsFromArray:commonArray filteredByIdentifier:AVMetadataIdentifierTuneSMetadataCoverart];
NSLog(@“commonArray=%lu”,(无符号长)[commonArray计数]//返回3
NSLog(@“albumArray有%lu”,(无符号长)[albumArray计数]//返回0或null
//测试B
用于(asset.commonMetadata中的AVMetadataItem*metadataItem){
if([metadataItem.commonKey isEqualToString:@“artwork”]){
NSDictionary*imageDataDictionary=(NSDictionary*)metadataItem.value;
NSData*imageData=[imageDataDictionary objectForKey:@“数据”];
UIImage*image=[UIImage imageWithData:imageData];
coveratimage.image=图像;
}
}
//测试C
for(commonArray中的AVMetadataItem*项){
if([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]){
NSData*newImage=[item.value copyWithZone:nil];
coveratimage.image=[UIImage-imageWithData:newImage];
}
}
//测试D
for(asset.metadata中的AVMetadataItem*项){
如果([item.commonKey isEqualToString:@“artwork”]){
NSDictionary*imageDataDictionary=(NSDictionary*)item.value;
NSData*imageData=[imageDataDictionary objectForKey:@“数据”];
UIImage*image=[UIImage imageWithData:imageData];
coveratimage.image=图像;
}
if([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]){
NSData*newImage=[item.value copyWithZone:nil];
coveratimage.image=[UIImage-imageWithData:newImage];
}
}

所有封面艺术图像返回null或从未调用。此外,按照苹果公司的建议,从direct文件中提取封面图片是异步的,但无论我在什么设备上试用过它,都至少需要10秒钟。iOS 7允许我们直接从mediaItem中提取封面艺术,这是即时的,我不明白为什么他们会削弱这一功能。

我建议尝试新的Swift实现:

let query = MPMediaQuery.songsQuery()
let mediaCollection = MPMediaItemCollection(items: query.items!)
print(mediaCollection.items)
这将返回下载歌曲的物理设备的非空数组。

NSString*queryString=[url query];
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];
if(queryString==nil)//不应该发生 返回零; NSArray*components=[queryString components由字符串分隔:@“=”]; if([components count]<2)//也不应该发生 返回零; id trackId=[components objectAtIndex:1]; MPMediaQuery*query=[[MPMediaQuery alloc]init]; [查询addFilterPredicate:[MPMediaPropertyPredicate谓词WithValue:trackId forProperty:MPMediaItemPropertyTypersTestId]; NSArray*items=[查询项]; [查询发布]; 如果([items count]<1)//仍然不应该发生 返回零; MPMediaItem*mpitem=[items objectAtIndex:0]; MPMediaItemArtwork*mpArt=[mpitem valueForProperty:MPMediaItemPropertyNetwork]; UIImage*mpImage=[mpArt imageWithSize:mpArt.bounds.size];
您有进一步的了解吗?您是否尝试过MPMediaQuery.songsQuery()?请在回答中添加一些解释!