Как определить, представляет ли MPMediaItem аудиодорожку с защитой DRM на iOS - PullRequest
19 голосов
/ 06 апреля 2011

Хотелось бы узнать, предназначен ли MPMediaItem, представляющий музыкальную дорожку, для элемента, защищенного Fairplay / DRM.Есть ли способ сделать это?

Ответы [ 7 ]

10 голосов
/ 14 сентября 2011

Вот как я это делаю:

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);
}
6 голосов
/ 19 июня 2011

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

MPMediaItem item;
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem *avItem = [[AVPlayerItem alloc] initWithURL:assetURL];
BOOL fairplayed = avItem.asset.hasProtectedContent;
5 голосов
/ 22 мая 2012

В iOS 4.2 класс AVAsset имеет свойство hasProtectedContent, поэтому вы можете проверить:

NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [AVAsset assetWithURL:assetURL];

if ([asset hasProtectedContent] == NO) {..do your stuff..}
4 голосов
/ 07 декабря 2017

MPMediaItemPropertyAssetURL равно не ноль на iPhone X работает iOS 11 для песен сохранено в автономном режиме через Apple Music , но AVPlayer не может их воспроизвести, поскольку они защищены DRM . Та же песня возвращает MPMediaItemPropertyAssetURL ноль на iOS 9 .

MPMediaItemPropertyAssetURL возвращает ноль для песен, добавленных в библиотеку через Apple Music , но недоступно в автономном режиме - оба на iOS 9 и 11 .

Таким образом, ответ @ voidStern (а не ответа Джастина Кента) является правильным способом проверки активов, защищенных DRM.

Swift 4 версия ответа voidStern (у меня отлично работает на iOS 9 до 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
}

Другой правильный способ проверки защищенного DRM-ресурса - использование свойства protectedAsset MPMediaItem - ответ @weirdyu. Но это свойство доступно только на iOS 9.2 и выше.

Swift 4 решение для этого метода (отлично работает для меня на iOS 9.2 и выше):

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
}
1 голос
/ 07 ноября 2017

iOS9.2 + : Пожалуйста, используйте MPMediaItem свойство «protectedAsset»

iOS9.2-: Судите MPMediaItem свойство assetURL ноль или нет

0 голосов
/ 04 октября 2015

Теперь я использую swift 2 для ios 9 и обнаружил, что мой код не работает с помощью hasProtectedContent или с помощью теста nil url. Я нашел следующий код работы:

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

Если элемент не воспроизводится AV Player, то это элемент DRM и должен воспроизводиться iPod Player (теперь называется SystemMusicPlayer).

0 голосов
/ 19 мая 2014

Решение Джастина Кента прекрасно работает.Однако я рекомендую использовать блоки, иначе UX пострадает, если вы разберетесь с кучей песен:

...