【问题标题】:MPMediaItem and iTunes MatchMPMediaItem 和 iTunes 匹配
【发布时间】:2011-12-30 00:55:04
【问题描述】:

我有一个应用程序使用 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 下载。

【问题讨论】:

  • 这个问题可能更适合 Apple.SE
  • Apple.SE 不是更适合使用设备而不是在设备上编码吗?
  • 你能澄清一下你所说的“他们的'可出口'标志”是什么意思吗?我不知道可出口的财产。你指的是 MPMediaItemPropertyAssetURL 吗?
  • 是的,这很不清楚......使用 MPMediaItemPropertyAssestURL,获取 AVAsset 然后是 AVAsset 的 .exportable 属性。
  • 查询 MPMediaItemPropertyAssetURL 当歌曲不在您的库中时返回 nil NSURL,因此 [AVAsset assetWithURL:url] 返回 nil,而不是 AVAsset。

标签: objective-c ios core-audio ipod icloud


【解决方案1】:

我找到了一些东西,但不是很好。如果您选择要通过 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];

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

【讨论】:

  • iPodMusicPlayer 已弃用。相反,我们可以使用 systemMusicPlayer。
  • 截至 2019 年,此解决方案似乎不再适用。歌曲已播放,但现在已下载。如果您进入音乐应用程序,您可以验证这一点。下载图标还在。下载它的唯一方法是实际点击音乐应用程序中的下载图标。这很糟糕……
【解决方案2】:

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

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

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

【讨论】:

  • 我还发布了一个错误报告(#12736293),描述如下:There is no API in the iOS SDK to determine whether a track is available locally vs. on iCloud (in iTunes Match), nor is there any API to track its download status. There is no way to distinguish between tracks that are available locally vs. those that are only available via iCloud, and if you start to play a media item that requires downloading, there is no way to monitor the download progress (started, failed, in-progress, complete)
  • 您的报告有什么进展吗? (您好,从 2015 年开始,问题似乎仍然存在)
  • ?? 你好,从 2019 年开始,仍然没有任何变化......?
【解决方案3】:

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

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

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

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

【讨论】:

  • 据我所知,iOS 10 仍未修复。
  • 非常不幸。苹果团队仍然没有对此做出回应.. :(
【解决方案4】:

MPMediaItem | iCloud or DRM Protected

上面的链接显示了如何使用 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)

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

【讨论】:

  • 有人听说过更新吗?我们能否访问 iTunes 比赛数据并强制下载?
猜你喜欢
  • 1970-01-01
  • 2013-01-07
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 2017-02-20
  • 2012-04-11
  • 1970-01-01
相关资源
最近更新 更多