Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c MPMediaItem与iTunes匹配_Objective C_Ios_Core Audio_Ipod_Icloud - Fatal编程技术网

Objective c MPMediaItem与iTunes匹配

Objective c MPMediaItem与iTunes匹配,objective-c,ios,core-audio,ipod,icloud,Objective C,Ios,Core Audio,Ipod,Icloud,我有一个应用程序,它使用iPod Library API访问iOS中的歌曲数据库。随着iTunes Match的发布,任何不在设备上的歌曲都将无法加载。有没有办法让我请求下载这首歌?也许使用新的iCloudAPI 编辑: 明确地说,我不是在问如何使用iPhone下载iTunes Match歌曲。iOS SDK允许通过MPMediaQuery/MPMediaItems访问iPod库。在具有iTunes Match功能的iOS设备上,iTunes Match库中的歌曲(设备上不是本地歌曲)通过MPM

我有一个应用程序,它使用iPod Library API访问iOS中的歌曲数据库。随着iTunes Match的发布,任何不在设备上的歌曲都将无法加载。有没有办法让我请求下载这首歌?也许使用新的iCloudAPI

编辑: 明确地说,我不是在问如何使用iPhone下载iTunes Match歌曲。iOS SDK允许通过MPMediaQuery/MPMediaItems访问iPod库。在具有iTunes Match功能的iOS设备上,iTunes Match库中的歌曲(设备上不是本地歌曲)通过MPMediaQuery返回,但MPMediaItems的“可导出”标志设置为false。当我在音乐应用程序中访问这些歌曲时,它们会自动下载。我想通过MPMediaItem触发相同的自动下载


我看到iTunes Match中的项目被作为iCloud的一部分,iOS 5 SDK中有一个新的iCloud部分。然而,据我所知,我只能在上传应用程序时获取数据。我希望有办法通过MPMediaItem或通过iCloud使用URL触发iTunes Match下载

我发现了一些东西,但不是很好。如果您选择要通过iPod播放器播放的歌曲,则会触发下载。您可以使用MPMusicLayerController访问iPod播放器

MPMusicPlayerController *mDRMAudioPlayer;
mDRMAudioPlayer = [MPMusicPlayerController iPodMusicPlayer];

MPMediaQuery *assetQuery = [[MPMediaQuery alloc] init];
NSNumber *persistentID = [mediaItem valueForProperty: MPMediaItemPropertyPersistentID];
MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue: persistentID 
                                                                       forProperty: MPMediaItemPropertyPersistentID];
[assetQuery addFilterPredicate: predicate];

[mDRMAudioPlayer setQueueWithQuery: assetQuery];
[mDRMAudioPlayer play];

没有关于这是否真的开始下载的反馈,也没有关于下载进度的反馈,但该项目将开始下载,如果你的连接良好,它将第一次播放(否则你可以垃圾邮件播放,它将开始播放)。

我刚刚收到苹果关于这个问题的回复(我使用了我的一个技术支持事件)

据苹果称,iOS SDK目前没有提供任何用于启动从iCloud下载的API。我被指示通过提交此功能的增强请求。我鼓励其他人也这样做


考虑到iCloud是iOS 5的定义功能之一,苹果真的应该为从iCloud下载音频资产提供编程支持。

这里有一些需要注意的东西。我的应用程序执行普通的
[MPMediaQuery albumsQuery]
收集所有专辑及其歌曲。即使整个音乐库都包含iTunes Match内容,其中大部分内容仍在云中,这也可以正常工作。但有一个问题:

如果此时正在播放一首歌曲,并且该歌曲在云中,因此现在正在下载,那么
[MPMediaQuery albumsQuery]
的结果中会丢失该歌曲和专辑中的下一首歌曲。这可能是因为这些歌曲“正在传输”:它们都是部分下载的。(我假设总是下载两首歌曲,以便在第一首歌曲完成时可以无缝切换到下一首。)

此外,播放并因此下载歌曲会触发
MPMediaLibraryDidChangeNotification
,即使库的“目录”实际上没有更改

我看不出有什么办法可以解决这个问题,因为没有其他方法可以查询库。苹果需要修复系统和API,以考虑iTunes Match的存在。不幸的是,我没有感觉到他们正在为iOS 5.1开发这个…

上面的链接显示了如何使用iOS 6中引入的属性查看MPMediaItem是否在云中

即使用宏来确保只有iOS 6使用与iOS 6一起添加的代码。下面是该宏

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

就我所知,您仍然无法启动下载。

这个问题可能更适合Apple。Apple.SE不是更适合使用设备而不是在设备上编码吗?您能澄清一下“他们的‘可导出’标志”是什么意思吗?我不知道有可导出的属性。你是指MPMediaItemPropertyAsetUrl吗?是的,这相当不清楚…使用MPMediaItemPropertyAsetUrl,获取AVAsset,然后获取AVAsset的.exportable属性。查询MPMediaItemPropertyAsetUrl,当歌曲尚未在你的库中时,返回一个无NSURL,因此[AVAsset assetWithURL:url]返回nil,而不是AVAsset。我还发布了一个关于它的bug报告(#12736293),描述如下:
iOS SDK中没有API来确定曲目在本地与iCloud(iTunes Match)上是否可用,也没有任何API来跟踪其下载状态。无法区分本地可用的曲目和仅通过iCloud可用的曲目,并且如果您开始播放需要下载的媒体项目,则无法监控下载进度(已启动、失败、正在进行、已完成)
您的报告有什么进展吗?(您好,从2015年开始,问题似乎仍然存在)有人听说过更新吗?我们能够访问itunes match数据并强制下载吗?据我所知,iOS 10仍然没有修复。非常不幸。苹果团队仍然没有对此做出回应(iPodMusicLayer已被弃用。相反,我们可以使用SystemMusicLayer。从2019年起,此解决方案似乎无法正常工作。歌曲已播放,但现在已下载。如果您进入音乐应用程序,您可以验证这一点。下载图标仍然存在。下载它的唯一方法是在音乐应用程序中实际点击下载图标。这太糟糕了…
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)