Я хотел бы знать, является ли MPMediaItem, представляющим музыкальный трек, для элемента, защищенного с помощью Fairplay/DRM. Любой способ сделать это?
Как определить, поддерживает ли MPMediaItem звуковую дорожку, защищенную DRM, на iOS
Ответ 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).