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

MPMediaItem и iTunes Match

У меня есть приложение, которое использует API библиотеки iPod для доступа к базе данных песен в iOS. С выпуском iTunes Match любая песня, которая не находится на устройстве, не загрузится. Есть ли способ, которым я хочу, чтобы песня была загружена? Возможно, используя новый API iCloud?

Edit: Чтобы быть ясным, я не спрашиваю, как загружать песни с помощью iTunes Match с помощью iPhone. SDK iOS обеспечивает доступ к библиотеке iPod через MPMediaQuery/MPMediaItems. На устройстве iOS с включенными песнями iTunes Match, которые находятся в вашей библиотеке iTunes Match, но не локальны на устройстве, возвращаются с помощью MPMediaQuery, однако у параметров MPMediaItems установлен флаг "exportable" равным false. Когда я получаю доступ к этим песням в приложении "Музыка", они автоматически загружаются. Я хотел бы запустить такую ​​же автоматическую загрузку через MPMediaItem.

Я видел элементы в iTunes Match, рецензируемые как часть iCloud, и есть новый раздел iCloud в iOS 5 SDK. Однако, насколько я понимаю, я могу получить данные, загруженные в приложение. Я надеялся, что есть способ через MPMediaItem или использовать URL-адрес через iCloud для запуска загрузки iTunes Match.

4b9b3361

Ответ 1

Я что-то нашел, но это не здорово. Если вы выберете песню, которая будет воспроизводиться через плеер iPod, это вызовет загрузку. Вы можете получить доступ к плееру iPod с помощью MPMusicPlayerController.

MPMusicPlayerController *mDRMAudioPlayer;
mDRMAudioPlayer = [MPMusicPlayerController iPodMusicPlayer];

MPMediaQuery *assetQuery = [[MPMediaQuery alloc] init];
NSNumber *persistentID = [mediaItem valueForProperty: MPMediaItemPropertyPersistentID];
MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue: persistentID 
                                                                       forProperty: MPMediaItemPropertyPersistentID];
[assetQuery addFilterPredicate: predicate];

[mDRMAudioPlayer setQueueWithQuery: assetQuery];
[mDRMAudioPlayer play];

Никакой обратной связи, если это действительно началось с загрузки или нет, или прогресс в загрузке, но элемент начнет загружаться, и если ваше соединение будет хорошим, оно будет воспроизводиться в первый раз (в противном случае вы можете спам играть, и он будет приближаться к отправной).

Ответ 2

MPMediaItem | iCloud или DRM защищены

В приведенной выше ссылке показано, как вы можете использовать свойство, введенное в iOS 6, чтобы узнать, находится ли MPMediaItem в облаке.

MPMediaItemPropertyIsCloudItem

BOOL isCloud = FALSE;

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
    NSNumber *isCloudNumber = [mediaItem valueForProperty:MPMediaItemPropertyIsCloudItem];
    isCloud = [isCloudNumber boolValue];
}
if (isCloud) {
    DebugLog(@"Cloud Asset URL: %@", assetURL);
}

Это использование макроса, чтобы гарантировать, что только iOS 6 использует этот код, который был добавлен с iOS 6. Ниже этот макрос.

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

Тем не менее вы не можете инициировать загрузку, насколько я могу судить.

Ответ 3

Я только что услышал от Apple об этой проблеме (я использовал один из моих инцидентов технической поддержки).

Согласно Apple, SDK iOS в настоящее время не предоставляет никаких API для запуска загрузки из iCloud. Мне было поручено подать запрос об улучшении этой функции с помощью Инструмент репортера ошибок Apple. Я бы рекомендовал другим сделать то же самое.

Apple действительно должна предоставлять программную поддержку для загрузки аудио-активов из iCloud, учитывая, что iCloud является одной из определяющих особенностей iOS 5.

Ответ 4

Здесь что-то следить. Мое приложение делает обычный [MPMediaQuery albumsQuery], чтобы собрать все альбомы и их песни. Это прекрасно работает, даже если вся музыкальная библиотека состоит из iTunes Match, большинство из которых все еще находится в облаке. Но есть одна проблема:

Если в этот момент воспроизводится песня, и если эта песня была в облаке, так что теперь она загружается, эта песня и следующая песня в альбоме отсутствуют в результате [MPMediaQuery albumsQuery]. Это, по-видимому, потому, что эти песни "находятся в пути": они частично загружены. (Я предполагаю, что две песни всегда загружаются так, что когда первые заканчиваются, можно легко перейти к следующему.)

Кроме того, воспроизведение и, следовательно, загрузка песни вызывает MPMediaLibraryDidChangeNotification, даже если "оглавление" библиотеки фактически не изменилось.

Я не вижу никакого способа обойти это, потому что нет другого способа запросить библиотеку. Apple должна исправить систему и API, чтобы учесть существование iTunes Match. К сожалению, я не понимаю, что они работают над этим для iOS 5.1...