MPMediaPickerController.showsCloudItems ничего не делает
Отправлено это на Apple без везения, но теперь, когда iOS 6 NDA поднялся, надеясь, что больше глаз увидят его здесь.
Я пытаюсь изменить приложение, чтобы разрешить пользователю выбирать музыку, загруженную локально. У меня есть следующий код под iOS 6 GM:
MPMediaPickerController* mpc = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAnyAudio];
mpc.allowsPickingMultipleItems = YES;
mpc.modalPresentationStyle = UIModalPresentationCurrentContext;
mpc.showsCloudItems = NO;
[self presentViewController:mpc animated:YES completion:nil];
Из документации:
Поведение по умолчанию для элемента выбора элементов мультимедиа - ДА, что означает сборщик показывает доступные элементы iCloud. Элемент мультимедиа считается iCloud, если он доступен через iTunes Match и еще не установлен сохраненных на устройстве.
Я считаю, что если iTunes Match включен, на сборщике будут отображаться только те элементы, которые были загружены на устройство, однако я всегда вижу всю библиотеку iTunes Match. Я подал на него радар, потому что это похоже на серьезную ошибку. Если кто-нибудь скажет мне иначе, я хотел бы узнать, чего я здесь не вижу.
Ответы
Ответ 1
Кажется, это проблема с ОС.
Использование picker.showsCloudItems = NO;
правильно показывает меньше песен, а не весь список... В песнях, перечисленных там, есть песни, которые либо были загружены вручную в приложении "Музыка", либо в песнях, которые были потоковыми и, следовательно, кэшированы.
Проблема, по крайней мере в моем случае, связана с кэшированными.
Если я выбираю песню, загруженную вручную, значение MPMediaItemPropertyIsCloudItem
равно NO
, что является правильным. Я также могу получить доступ к URL-адресу ресурса с помощью свойства MPMediaItemPropertyAssetURL
.
С другой стороны, выбор кешированной песни возвращает YES
на MPMediaItemPropertyIsCloudItem
и nil
на MPMediaItemPropertyAssetURL
, что делает песню практически бесполезной для меня.
Извините, у меня нет фактического ответа, но у меня недостаточно репутации, чтобы просто комментировать.
Надеюсь, что мои 2 цента помогут как-то, но мне действительно кажется, что эта проблема может быть решена Apple только в будущем обновлении.
Ответ 2
Лучшее решение для проверки того, входит ли элемент из iCloud в делегат didPickMediaItems:
MPMediaItem *selectedItem = [selectedItems objectAtIndex:0];
if (![[selectedItem valueForProperty:MPMediaItemPropertyIsCloudItem] boolValue])
Вам не нужно играть в нее, более эффективно использовать встроенное свойство в MPMediaItem.
Ответ 3
У меня была такая же проблема. Хотя я не смог скрыть элементы, вот хорошее обходное решение, которое я использовал, чтобы люди не могли их выбирать. Внутри didPickMediaItems
вы должны временно загрузить его в AVPlayerItem
, а затем просто проверить правильность этого элемента следующим образом:
- (void)mediaPicker:(MPMediaPickerController *)mediaPicker didPickMediaItems:(MPMediaItemCollection *)mediaItemCollection
{
MPMediaItem *selectedItem = [[mediaItemCollection items]objectAtIndex:0];
NSURL *tempURL = [selectedItem valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem *playerItem = [[AVPlayerItem alloc]initWithURL:tempURL];
if(playerItem.loadedTimeRanges==NULL)
{
UIAlertView *alert=[[[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Invalid Song Choice",NULL) message:NSLocalizedString(@"Please choose a song that is local to your phone.",NULL) delegate:self cancelButtonTitle:NSLocalizedString(@"Okay",NULL) otherButtonTitles:nil]autorelease];
[alert show];
[playerItem release];
}
else
{
NSLog(@"Your good to go...do whatever you want with the local song");
}
}
Ответ 4
Кажется, он исправлен в iOS 7.
Работает следующий код: Элементы iCloud не отображаются:
MPMediaPickerController *picker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic];
picker.delegate = self;
picker.allowsPickingMultipleItems = NO;
picker.showsCloudItems = NO;