MPMedia API中的有趣错误
我的音乐应用程序中有一个持续的错误,我现在终于找到了(现在我正在迅速重写它)。它有一些方面。 (使用systemMusicPlayer)
好的,所以asinine和真气。
现在问我的问题:
我无法做任何关于无法知道设备上是否有云项目(通过iTunes)的事情。我/应该/只能过滤掉一个项目是否有一个assetURL,但这可以保证它是本地的和可用的。
let filter:MPMediaPropertyPredicate = MPMediaPropertyPredicate(value: "ipod", forProperty: MPMediaItemPropertyAssetURL, comparisonType: MPMediaPredicateComparison.Contains)
这会返回0项。 是否有人知道过滤此属性的方法?在此处执行此操作似乎是最干净的,并且应该让查询返回items和itemSections。我的所有表格都是从查询中填充的,我不认为这是一种手动重建的方法。
网址格式如下:ipod-library://item/item.m4a?id = 5314739480586915369
现在,我怀疑在填充表格视图等时可以添加捕获量,但它感觉非常混乱。
这是ios 9.2.1,Swift 2,Xcode 7.2.1
我还没有擦过手机并重新复制了这些歌曲。从音乐应用程序手动下载它们是物品获得assetURL的唯一方式(如果不存在)。
答案 0 :(得分:0)
效率不高,但有一件事你可以做:
let query = MPMediaQuery()
let allItems = query.items ?? []
let items = allItems.filter { $0.assetURL?.scheme?.hasPrefix("ipod") ?? false }
答案 1 :(得分:0)
在MPMediaItem.h中,您只能看到以下内容是可过滤的(并带有可过滤的注释):
MPMediaItemPropertyPersistentID
MPMediaItemPropertyMediaType
MPMediaItemPropertyTitle
MPMediaItemPropertyAlbumTitle
MPMediaItemPropertyAlbumPersistentID
MPMediaItemPropertyArtist
MPMediaItemPropertyArtistPersistentID
MPMediaItemPropertyAlbumArtist
MPMediaItemPropertyAlbumArtistPersistentID
MPMediaItemPropertyGenre
MPMediaItemPropertyGenrePersistentID
MPMediaItemPropertyCompose
MPMediaItemPropertyComposerPersistentID
MPMediaItemPropertyIsCompilation
MPMediaItemPropertyIsCloudItem
MPMediaItemPropertyHasProtectedAsset
MPMediaItemPropertyPodcastTitle
MPMediaItemPropertyPodcastPersistentID
MPMediaItemPropertyPlayCount
因此,不可能以assetURL属性为条件构建任何查询。除非您获取所有MPMediaItems并执行NSArray搜索,否则尝试对assetURL做任何事情都是死胡同。
我还从苹果的文档中的某个地方模糊地记得,无论如何您都无法获得有关云项目下载位置的信息。
但是,如果您想进一步调查云/本地问题,建议您在打开或关闭iCloud音乐库并查看MPMediaItemPropertyHasProtectedAsset的情况下考虑用户的音乐设置。
如果目的是检测歌曲是否是本地歌曲,则可以对isCloudItem == FALSE和hasProtectedAsset == FALSE进行查询,在这种情况下assetURL无关紧要。