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