错误:MPMediaItem iOS和iOS上的下载状态MPMediaPropertyPredicate使用assetURL

时间:2016-03-05 23:50:11

标签: ios swift mpmediaitem mpmediaquery

MPMedia API中的有趣错误

我的音乐应用程序中有一个持续的错误,我现在终于找到了(现在我正在迅速重写它)。它有一些方面。 (使用systemMusicPlayer)

  1. 我认为我已将问题缩小到具有以下属性的MPMediaItem。
    • MPMediaItemPropertyIsCloudItem = true
    • assetURL = nil
    • **这两个是有道理的,但是下面的角落情况(很可能很常见)让我耽搁了一段时间**
    • 前两项可能是真的,但我相信如果你从iTunes复制它,它/可以/可玩(它们大部分时间都会播放给我),而且无法分辨。我一遍又一遍地测试过这种情况,但似乎是这种情况,但这些MPMediaItems的存在可能只会引起问题,或者它们没问题。但你无法找出这些歌曲。
  2. 如果您正在播放队列,那么systemMusicPlayer会遇到一个 你的图书馆中的歌曲但没有从iTunes下载或复制,我相信它会自动跳过 歌曲,类似于systemMusicPlayer.skipToNextItem(),但我认为 在内部,它是一种不同的机制。
    • 2a上。如果您正在使用systemMusicPlayer.skipToPreviousItem()并遇到一个本来可以跳过的项目,这种行为会导致一个基本上无法恢复的问题 - 这意味着,它并没有意识到您正在尝试移回队列并且只是抛出错误并向前移动队列。
    • 2B。据我所知,当错误发生时,MPMediaItem永远不会成为nowPlayingItem。 MPMediaItem元数据(它总是在本地或不在本地的天气)加载后会出现问题,但试图播放的歌曲会立即将其向前发送到队列中。
  3. 好的,所以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的唯一方式(如果不存在)。

2 个答案:

答案 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无关紧要。