如何检测MPMediaItem是否代表iOS上受DRM保护的音轨

时间:2011-04-06 18:13:15

标签: iphone drm mpmediaitem

我想知道代表音乐曲目的MPMediaItem是否适用于受Fairplay / DRM保护的项目。有什么办法吗?

7 个答案:

答案 0 :(得分:10)

我是这样做的:

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

答案 1 :(得分:6)

由于iOS 4.2有一种方法。这里的示例可能有一个更有效的方法(但对于我的应用程序,我还需要创建AVPlayerItems。)

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

答案 2 :(得分:5)

从iOS 4.2开始,AVAsset类的属性为hasProtectedContent,因此您可以查看:

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

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

答案 3 :(得分:3)

运行 iOS 11 的iPhone X上

MPMediaItemPropertyAssetURL 非零 通过 Apple Music 保存离线 em>但AVPlayer无法播放,因为 DRM 受保护。同一首歌在 iOS 9 上返回MPMediaItemPropertyAssetURL nil

对于通过 Apple Music 添加到图书馆但无法离线的歌曲,

MPMediaItemPropertyAssetURL会返回 nil - 两者都在 iOS上9& 11

因此,@ voidStern的答案(而不是Justin Kent' s)是测试受DRM保护的资产的正确方法。

斯威夫特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的{​​{1}}属性 - @weirdyu的答案。但是,此属性仅适用于 iOS 9.2 及更高版本。

Swift 4 此方法的解决方案(适用于 iOS 9.2 及以上版本):

MPMediaItem

答案 4 :(得分:1)

iOS9.2 +: 请使用MPMediaItem“protectedAsset”属性

iOS9.2-: 法官MPMediaItem“assetURL”属性是否为

答案 5 :(得分:0)

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

答案 6 :(得分:0)

现在我正在使用swift 2构建ios 9,我发现使用hasProtectedContent或使用nil url测试来破坏我的代码。我发现以下代码有效:

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

如果AV播放器无法播放该项目,则它是DRM项目,应由iPod播放器播放(现称为SystemMusicPlayer)。