30

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

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

我已经看到 iTunes Match 中的项目被称为 iCloud 的一部分,并且 iOS 5 SDK 中有一个新的 iCloud 部分。但是,据我了解,我只能获取我的应用上传的数据。我希望有一种方法可以通过 MPMediaItem 或通过 iCloud 使用 URL 来触发 iTunes Match 下载。

4

4 回答 4

15

我发现了一些东西,但不是很好。如果您选择要通过 iPod 播放器播放的歌曲,则会触发下载。您可以使用 MPMusicPlayerController 访问 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];

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

于 2011-12-05T23:24:58.967 回答
7

MPMediaItem | 受 iCloud 或 DRM 保护

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

MPMediaItemPropertyIsCloudItem

BOOL isCloud = FALSE;

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
    NSNumber *isCloudNumber = [mediaItem valueForProperty:MPMediaItemPropertyIsCloudItem];
    isCloud = [isCloudNumber boolValue];
}
if (isCloud) {
    DebugLog(@"Cloud Asset URL: %@", assetURL);
}

那是使用宏来确保只有 iOS 6 使用随 iOS 6 添加的代码。下面是那个宏。

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

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

于 2013-03-10T21:09:26.813 回答
7

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

根据 Apple 的说法,iOS SDK 目前不提供任何用于从 iCloud 启动下载的 API。我被指示通过Apple 的错误报告工具提交对此功能的增强请求。我会鼓励其他人也这样做。

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

于 2012-01-06T15:34:53.970 回答
3

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

如果当时正在播放一首歌曲,并且如果该歌曲在云中,那么现在正在下载它,则该歌曲和专辑中的下一首歌曲[MPMediaQuery albumsQuery]. 这可能是因为这些歌曲“正在传输中”:它们都被部分下载。(我认为总是会下载两首歌曲,这样当第一首歌曲完成时,就可以无缝衔接到下一首歌曲。)

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

我没有看到任何解决方法,因为没有其他方法可以查询库。Apple 需要修复系统和 API 以考虑 iTunes Match 的存在。不幸的是,我没有感觉到他们正在为 iOS 5.1 开发这个......

于 2012-01-31T16:44:46.947 回答