Подтвердить что ты не робот

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. Я подал на него радар, потому что это похоже на серьезную ошибку. Если кто-нибудь скажет мне иначе, я хотел бы узнать, чего я здесь не вижу.

4b9b3361

Ответ 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;