iphone drm mpmediaitem

iphone - Cómo detectar si un MPMediaItem representa una pista de audio protegida por DRM en iOS



(7)

Ahora estoy construyendo Swift 2 para iOS 9, encontré mi código roto usando hasProtectedContent o usando la prueba de URL nula. He encontrado el siguiente código de trabajo:

let playerItem = AVPlayerItem(URL: mpMediaItem.assetURL!) playableByAVPlayer = (playerItem.status == .ReadyToPlay) ? true : false

Si el Reproductor de AV no puede reproducir el elemento, entonces es un elemento DRM y debe ser reproducido por el Reproductor de iPod (ahora llamado SystemMusicPlayer).

Me gustaría saber si un elemento MPMediaItem que representa una pista de música es para un elemento protegido por Fairplay / DRM. Alguna forma de hacer esto?


Así es como lo hago:

MPMediaItem* item; NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; NSString *title=[item valueForProperty:MPMediaItemPropertyTitle]; if (!assetURL) { /* * !!!: When MPMediaItemPropertyAssetURL is nil, it typically means the file * in question is protected by DRM. (old m4p files) */ NSLog(@"%@ has DRM",title); }


Desde iOS 4.2 hay una manera. Puede haber una manera más efectiva que el ejemplo aquí (pero para mi aplicación necesitaba crear AVPlayerItems de todos modos).

MPMediaItem item; NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; AVPlayerItem *avItem = [[AVPlayerItem alloc] initWithURL:assetURL]; BOOL fairplayed = avItem.asset.hasProtectedContent;


Desde iOS 4.2, la clase AVAsset tiene una propiedad hasProtectedContent para que pueda verificar:

NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; AVAsset *asset = [AVAsset assetWithURL:assetURL]; if ([asset hasProtectedContent] == NO) {..do your stuff..}


La solución de Justin Kents funciona muy bien. Aunque recomiendo usar bloques, de lo contrario, la UX sufrirá si tratas con un montón de canciones:

-(void)checkDRMprotectionForItem:(MPMediaItem*)item OnCompletion:(void (^)(BOOL drmProtected))completionBlock { dispatch_async(_drmCheckQueue, ^{ BOOL drmStatus; NSURL* assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL]; if (!assetURL) { drmStatus = YES; } dispatch_async(dispatch_get_main_queue(), ^{ if (completionBlock) { completionBlock(drmStatus); } }); }); }


iOS9.2 +: Utilice la propiedad MPMediaItem "protectedAsset"

iOS9.2-: la propiedad "assetURL" del juez MPMediaItem es nula o no


MPMediaItemPropertyAssetURL no es nula en iPhone X con iOS 11 para canciones guardadas sin conexión a través de Apple Music, pero AVPlayer no puede reproducirlas porque están protegidas por DRM . La misma canción devuelve MPMediaItemPropertyAssetURL nil en iOS 9 .

MPMediaItemPropertyAssetURL devuelve nil para las canciones agregadas a la biblioteca a través de Apple Music pero no está disponible sin conexión , tanto en iOS 9 como en 11 .

Por lo tanto, la respuesta de @ voidStern (y no la de Justin Kent) es la forma correcta de probar un activo protegido por DRM.

Swift 4 versión de la respuesta de voidStern (funciona perfectamente para mí en iOS 9 a 11 ):

let itemUrl = targetMPMediaItem?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL if itemUrl != nil { let theAsset = AVAsset(url: itemUrl!) if theAsset.hasProtectedContent { //Asset is protected //Must be played only via MPPlayer } else { //Asset is not protected //Can be played both via AVPlayer & MPPlayer/ } } else { //probably the asset is not avilable offline //Must be played only via MPPlayer }

Otra forma correcta de verificar los activos protegidos con DRM es haciendo uso de la propiedad protectedAsset de MPMediaItem , una respuesta de @weirdyu. Pero, esta propiedad está disponible solo en iOS 9.2 y superior.

Solución Swift 4 para este método (funciona perfectamente para mí en iOS 9.2 y superior):

if #available(iOS 9.2, *) { if (targetMPMediaItem?.hasProtectedAsset)! { //asset is protected //Must be played only via MPMusicPlayer } else { //asset is not protected //Can be played both via AVPlayer & MPMusicPlayer } } else { //Fallback on earlier versions //Probably use the method explained earlier }