Explore more content with MusicKit
System & Services 进阶 20m

用 MusicKit 探索更多音乐内容

Explore more content with MusicKit

2022年6月6日

在 Apple 官方观看视频

一句话判断

MusicKit 今年新增了策展人、排行榜、搜索建议和用户资料库访问——从”查歌”工具进化成了完整的音乐发现平台。

这场 Session 讲了什么

MusicKit 自 2021 年发布以来提供了访问 Apple Music 目录的基础能力。今年 Apple 大幅扩展了它的能力边界,涵盖四个方面:

目录内容增强:新增 Curator(策展人)和 Radio Show(电台节目)两种内容类型。Curator 可以是 Apple 编辑团队或第三方品牌(如 Nike、Shazam),每种 Curator 下有对应的播放列表。同时新增了搜索 Top Results(跨类型按相关性排序)和 Suggestions(自动补全建议)能力,大幅改善搜索体验。

排行榜 API:新增 MusicCatalogChartsRequest,可以获取热门歌曲、热门专辑、城市排行榜和每日全球 Top 100 等多种榜单。还支持按音乐类型筛选。

音频质量元数据:暴露了 Audio Variants 属性,让你能知道某首歌是否支持 Spatial Audio(Dolby Atmos)和 Lossless Audio。还新增了 isAppleDigitalMaster 布尔值,标识最高品质的数字母带。

用户资料库访问:今年最大的更新——你的应用现在可以读取用户个人资料库中的音乐。包括播放列表、喜欢的歌曲、最近播放等。同时支持写入操作:添加歌曲到资料库、创建和编辑播放列表。

值得深挖的点

Top Results 的”类型无关”设计思路解决了搜索 UI 中的一个老问题。过去搜索结果按类型分组返回(歌曲一组、专辑一组、艺术家一组),UI 上要么显示多个列表,要么只展示某一种类型。Top Results 把所有类型混在一起按相关性排序返回,单个列表直接展示最匹配的结果,无论它是歌曲、专辑还是艺术家。

Suggestions 和 Top Results 的组合可以构建出接近 Apple Music 原生应用的搜索体验——输入时实时显示建议词,选中后直接展示跨类型的 Top Results。这两个 API 的调用方式都很简洁。

资料库读写的权限模型需要开发者注意。读取用户资料库需要用户授权 MusicKit 权限,写入操作(添加歌曲、创建播放列表)有额外的权限检查。应用应该优雅地处理权限被拒绝的情况。

代码片段

搜索 Top Results:

// 创建目录搜索请求
var request = MusicCatalogSearchRequest(
    term: "Taylor Swift",
    types: [Song.self, Album.self, Artist.self]
)
// 启用 Top Results——跨类型按相关性排序
request.includeTopResults = true

let response = try await request.response()
// topResults 包含所有类型的混合结果,按相关性排序
for item in response.topResults {
    print("找到: \(item)")
}

获取搜索建议:

// 创建建议请求
let suggestionsRequest = MusicCatalogSuggestionsRequest(term: "beat")
let response = try await suggestionsRequest.response()

for suggestion in response.suggestions {
    // displayTerm 适合直接在 UI 展示
    print("建议: \(suggestion.displayTerm)")
    // searchTerm 用于发起实际搜索
    let searchRequest = MusicCatalogSearchRequest(
        term: suggestion.searchTerm,
        types: [Song.self, Album.self]
    )
}

获取排行榜:

var request = MusicCatalogChartsRequest()
// 指定榜单类型:热门、每日全球、城市
request.kinds = [.mostPlayed, .dailyGlobalTop]
// 指定内容类型
request.types = [Song.self, Album.self, Playlist.self]

let response = try await request.response()
for chart in response.charts {
    print("榜单: \(chart.name)")
    for item in chart.items {
        // 处理榜单项目
    }
}

检查音频质量:

// 加载专辑的音频变体信息
let detailedAlbum = try await album.with(\.audioVariants)
// 检查是否支持空间音频
if detailedAlbum.audioVariants.contains(.spatial) {
    // 在 UI 上展示 Dolby Atmos 标识
}
// 检查是否是 Apple Digital Master
if detailedAlbum.isAppleDigitalMaster {
    // 展示高品质标识
}

最佳实践

  • 搜索 UI 用 Suggestions + Top Results 组合:Suggestion 做自动补全,Top Results 做结果展示,体验最接近原生
  • Audio Variants 适合在详情页展示:在列表页展示会增加大量网络请求,建议只在用户进入详情时加载
  • 排行榜带分页MusicCatalogChart 的 items 集合内置分页支持,不要一次性加载所有榜单数据
  • 用户资料库操作要异步处理:网络状态不稳定时资料库操作可能较慢,用 async/await 配合加载状态提示
  • with() 方法加载扩展属性:基础查询不返回 audioVariants 等字段,需要显式请求

还有什么值得关注

  • Curator 类型的 kind 属性区分”editorial”(Apple 官方)和”external”(第三方),可以据此调整展示策略
  • Playlist 类型新增了 Curator 和 RadioShow 反向关系,方便从播放列表追溯来源
  • 用户资料库 API 意味着第三方音乐应用可以真正成为 Apple Music 的替代前端
  • 城市排行榜对做本地化音乐推荐的应用很有价值
WWDC 2022