我想知道代表音乐曲目的MPMediaItem是否适用于受Fairplay / DRM保护的项目。有什么办法吗?
答案 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)
MPMediaItemPropertyAssetURL
非零 通过 Apple Music 保存离线 em>但AVPlayer
无法播放,因为 DRM 受保护。同一首歌在 iOS 9 上返回MPMediaItemPropertyAssetURL
nil 。
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)。