8

iOS 8 以降、iPad および iPhone デバイスからのアルバム アートのすべてのデータ配列は null 配列を返します。ローカル ファイル (NSBundle) からプルするとアルバム アートやカバー アートを取得できますが、iTunes から購入した曲やデバイス自体の曲は空になります。

両方のデバイスで最新の 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];
    }

}

すべてのカバー アート イメージが null を返すか、呼び出されません。また、アップルが提案するように直接ファイルからカバーアートを引き出すことは非同期ですが、どのデバイスで試しても少なくとも10秒かかるようです. iOS 7 では、mediaItem からカバー アートを直接取得することができましたが、それは瞬時に行われました。

4

2 に答える 2