2014-11-03 9 views
8

आईओएस 8 के बाद से, आईपैड & से एल्बम कला के लिए सभी डेटा एरे एक आईफोन डिवाइस एक शून्य सरणी देता है। स्थानीय फ़ाइल (एनएसबंडल) से खींचते समय मुझे एल्बम आर्ट या कवर आर्ट मिल सकता है, लेकिन आईट्यून्स या डिवाइस पर खरीदे गए किसी भी गाने को खाली कर दिया जाता है।आईओएस 8 एल्बम कला कवर

मैंने नवीनतम एक्सकोड, दोनों डिवाइसों पर नवीनतम आईओएस और आईट्यून्स को भी अपडेट किया है। मैंने आईपैड 4, आईपैड एयर, आईफोन 5, आईफोन 6 पर परीक्षण किया है। उम्मीद है कि कोई जानता है कि क्या हो रहा है, यह अभी आईओएस 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 सेकंड लगते हैं, इससे कोई फर्क नहीं पड़ता कि मैंने किस डिवाइस पर कोशिश की है। आईओएस 7 ने हमें सीधे मीडिया आर्टम से कवर आर्ट खींचने की इजाजत दी और यह तात्कालिक था, मुझे समझ में नहीं आया कि वे उस समारोह को क्यों नकारेंगे।

+0

क्या आपको यहां कोई और मिला है? – newenglander

+0

क्या आपने MPMediaQuery.songsQuery() की कोशिश की है? – Aabglov

उत्तर

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

कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें! –