objective c - framework - MPMediaItem y iTunes Match
framework ios (4)
Tengo una aplicación que utiliza la API de la biblioteca del iPod para acceder a la base de datos de canciones en iOS. Con el lanzamiento de iTunes Match, cualquier canción que no esté en el dispositivo no podrá cargarse. ¿Hay alguna manera de solicitar la descarga de la canción? Tal vez usando la nueva API de iCloud?
Edición: para ser claros, no estoy preguntando cómo descargar canciones con iTunes Match usando el iPhone. El iOS SDK permite el acceso a la biblioteca del iPod a través de MPMediaQuery / MPMediaItems. En un dispositivo iOS con iTunes Match habilitado, las canciones que se encuentran en su biblioteca de iTunes Match pero no en el dispositivo se devuelven a través de MPMediaQuery; sin embargo, MPMediaItems tiene su indicador "exportable" establecido en falso. Cuando accedo a estas canciones en la aplicación Música, se descargan automáticamente. Me gustaría activar la misma descarga automática a través de MPMediaItem.
He visto artículos en iTunes Match como parte de iCloud y hay una nueva sección de iCloud del iOS 5 SDK. Sin embargo, como lo entiendo, solo puedo obtener datos de mi aplicación como subidos. Esperaba que hubiera una forma a través de MPMediaItem o usando la URL a través de iCloud para activar una descarga de iTunes Match.
Acabo de recibir una respuesta de Apple sobre este problema (usé uno de mis incidentes de soporte técnico).
Según Apple, el SDK de iOS no proporciona actualmente ninguna API para iniciar una descarga desde iCloud. Se me indicó que presentara una solicitud de mejora para esta función a través de la herramienta de reporte de errores de Apple . Yo animaría a otros a hacer lo mismo.
Apple realmente debería proporcionar soporte programático para descargar activos de audio desde iCloud teniendo en cuenta que iCloud es una de las características definitorias de iOS 5.
Aquí hay algo para tener cuidado. Mi aplicación hace un [MPMediaQuery albumsQuery]
para reunir todos los álbumes y sus canciones. Esto funciona bien incluso si toda la biblioteca de música está compuesta por iTunes Match, la mayoría de los cuales aún se encuentra en la nube. Pero hay un problema:
Si se está reproduciendo una canción en ese momento, y si esa canción estaba en la nube, de modo que ahora se está descargando, esa canción y la siguiente canción del álbum faltan en el resultado de [MPMediaQuery albumsQuery]
. Esto es probablemente porque esas canciones están "en tránsito": ambas están parcialmente descargadas. (Supongo que siempre se descargan dos canciones, de modo que cuando termina la primera es posible pasar a la perfección en la siguiente).
Además, al reproducir y, por lo tanto, descargar una canción, se activa una MPMediaLibraryDidChangeNotification
aunque la "tabla de contenido" de la biblioteca no haya cambiado de hecho.
No veo ninguna manera de evitar esto, ya que no hay otra forma de consultar la biblioteca. Apple necesita arreglar el sistema y las API para tener en cuenta la existencia de iTunes Match. Desafortunadamente, no tengo la sensación de que estén trabajando en esto para iOS 5.1 ...
He encontrado algo, pero no es genial. Si selecciona la canción que se reproducirá a través del reproductor iPod, se activará una descarga. Puede acceder al reproductor iPod con un 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];
No hay comentarios sobre si esto realmente inició una descarga o no, o el progreso en la descarga, pero el elemento comenzará a descargarse y si su conexión es buena, se reproducirá la primera vez (de lo contrario, puede reproducir spam y comenzará a comenzar).
MPMediaItem | iCloud o DRM Protegido
El enlace anterior muestra cómo puede usar una propiedad introducida en iOS 6 para ver si un MPMediaItem está en la nube.
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);
}
Eso es usar una macro para garantizar que solo iOS 6 use el código que se agregó con iOS 6. A continuación se muestra esa macro.
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Todavía no puedes iniciar una descarga lo que puedo decir.