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

Как определить, поддерживает ли MPMediaItem звуковую дорожку, защищенную DRM, на iOS

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

4b9b3361

Ответ 1

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

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);
}

Ответ 2

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

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

Ответ 3

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

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

if ([asset hasProtectedContent] == NO) {..do your stuff..}

Ответ 4

MPMediaItemPropertyAssetURL - это не ноль на iPhone X, работающий под iOS 11 для песен сохраненных в автономном режиме с помощью Apple Music, но AVPlayer не может играйте с ними, так как они защищены DRM. Эта же песня возвращает MPMediaItemPropertyAssetURL nil на iOS 9.

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

Таким образом, ответ @voidStern (а не Justin Kent's) является правильным способом тестирования для защищенного DRM-ресурса.

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

Ответ 5

iOS9.2 +: Используйте свойство MPMediaItem "protectedAsset"

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

Ответ 6

Решение Justin Kents отлично работает. Я рекомендую использовать блоки, хотя или UX будет страдать, если вы имеете дело с кучей песен:

-(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);
            }
    });
    });
}

Ответ 7

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

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

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