iOS 通过专辑 MPMediaEntityPersistentID 查询有时找不到歌曲

iOS Query via Album MPMediaEntityPersistentID sometimes brings back no songs

我正在编写一个使用 Apple 内置的 MediaPlayer 库播放音乐的应用程序。我存储了一系列专辑和一系列ID,然后选择一个专辑和ID时,我使用ID搜索专辑。出于某种原因,一些专辑无法找到任何歌曲,尽管有一个与之关联的 ID。每次都是同样的专辑,不行,而且好像没有规律。

我使用以下代码将名称和 ID 存储到两个数组中

let query = MPMediaQuery.albumsQuery()
let mediaCollection = MPMediaItemCollection(items: query.items!)

for album in mediaCollection.items {
            albumTitleArray.append(album.albumTitle!)
            albumIdArray.append(album.albumPersistentID)
        }

选中一个后,我将 id 传递给 queryMedia 方法

func queryMedia(identifier:MPMediaEntityPersistentID) -> MPMediaItemCollection {

    let predicateId = MPMediaPropertyPredicate(value: String(identifier), forProperty: MPMediaItemPropertyAlbumPersistentID, comparisonType:MPMediaPredicateComparison.EqualTo)

    let query = MPMediaQuery.init()
    query.addFilterPredicate(predicateId)

    let collection = MPMediaItemCollection(items: query.items!)

    return collection;
}

如能帮助解决此问题,我们将不胜感激!

肯定是某些字符格式不正确,或者查询中从 MPMediaEntityPersistentID 转换为 String 导致的比较错误。

我已将代码更改为转换为 NSNumber,查询现在可以正确找到所有相册。

在上面的代码示例中更改此部分

String(identifier)

NSNumber(unsignedLongLong: identifier)

看起来像这样

func queryMedia(identifier:MPMediaEntityPersistentID) -> MPMediaItemCollection {

let predicateId = MPMediaPropertyPredicate(value: NSNumber(unsignedLongLong: identifier), forProperty: MPMediaItemPropertyAlbumPersistentID, comparisonType:MPMediaPredicateComparison.EqualTo)

let query = MPMediaQuery.init()
query.addFilterPredicate(predicateId)

let collection = MPMediaItemCollection(items: query.items!)

return collection;
}

我目前正在使用 XCode 13.1 和 iOS 14.8,这仍然是一个问题。

我需要用 NSNumber(value: persistentId) 包装 persistentId 才能正常工作。

但我还发现,如果我首先使用 MPMediaQuery.songs() 创建查询,那么我就不必使用 NSNumber()

func LoadMediaLibraryTrackData(_ track: inout AudioZoomTrack, _ persistentId:MPMediaEntityPersistentID) {
        
  /// Works
  let trackFilter = MPMediaPropertyPredicate(value: NSNumber(value: persistentId), forProperty: MPMediaItemPropertyPersistentID)
  let query = MPMediaQuery(filterPredicates: [trackFilter])

  /// Fails
  let trackFilter = MPMediaPropertyPredicate(value: persistentId, forProperty: MPMediaItemPropertyPersistentID)
  let query = MPMediaQuery(filterPredicates: [trackFilter])

  /// Works
  let query = MPMediaQuery.songs()
  let trackFilter = MPMediaPropertyPredicate(value: persistentId, forProperty: MPMediaItemPropertyPersistentID)     
  query.addFilterPredicate(trackFilter)

  ...
}