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

我想知道代表音乐曲目的MPMediaItem是否适用于受Fairplay / DRM保护的项目。有什么办法吗?     
已邀请:
我是这样做的:
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);
}
    
从iOS 4.2开始,有一种方法。这里的示例可能有一个更有效的方法(但对于我的应用程序,我还需要创建AVPlayerItems)。
MPMediaItem item;
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVPlayerItem *avItem = [[AVPlayerItem alloc] initWithURL:assetURL];
BOOL fairplayed = avItem.asset.hasProtectedContent;
    
从iOS 4.2开始,
AVAsset
类有一个属性
hasProtectedContent
所以你可以检查:
NSURL *assetURL = [item valueForProperty:MPMediaItemPropertyAssetURL];
AVAsset *asset = [AVAsset assetWithURL:assetURL];

if ([asset hasProtectedContent] == NO) {..do your stuff..}
    
对于通过Apple Music离线保存的歌曲,运行iOS 11的iPhone X上的
MPMediaItemPropertyAssetURL
不是零,但
AVPlayer
因为受DRM保护而无法播放。同一首歌在iOS 9上返回
MPMediaItemPropertyAssetURL
nil。
MPMediaItemPropertyAssetURL
对于通过Apple Music添加到“图书馆”但不能离线使用的歌曲返回nil - 在iOS 9& 11。 因此,@ voidStern的答案(而不是Justin Kent的)是测试受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保护的资产的另一种正确方法是利用
MPMediaItem
protectedAsset
属性 - @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
}
    
iOS9.2 +: 请使用MPMediaItem“protectedAsset”属性 iOS9.2-: 法官MPMediaItem“assetURL”属性是否为零     
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);
            }
    });
    });
}
    
现在我正在使用swift 2 for ios 9,我发现使用hasProtectedContent或使用nil url测试来破坏我的代码。我发现以下代码有效:
    let playerItem = AVPlayerItem(URL: mpMediaItem.assetURL!)
    playableByAVPlayer = (playerItem.status == .ReadyToPlay) ? true : false
如果AV播放器无法播放该项目,则它是DRM项目,应由iPod播放器(现在称为SystemMusicPlayer)播放。     

要回复问题请先登录注册