You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift调用MusicKit接口因Authorization头错误导致请求失败

问题根因

你遇到的401状态码是请求未携带合法Apple Music API鉴权令牌导致的,后续的JSON解析错误是连带问题:鉴权失败时接口不会返回目标歌曲的结构化JSON,仅返回空内容或错误文本,自然无法完成解码,优先解决鉴权问题即可。
你需要的公开目录查询场景完全不需要申请用户Apple Music个人资料库的访问权限,只要正确配置MusicKit的自动令牌生成能力,不需要手动在代码里传入私钥、手动拼接鉴权头,系统会自动完成令牌的生成、注入和刷新。

前置配置检查

先确认你已经完成了自动令牌生成的必填配置,这一步不需要写任何代码:

  • 登录Apple Developer后台,找到你当前App对应的Identifier,开启MusicKit服务能力
  • 回到Xcode,给当前Target添加MusicKit Capability,Xcode会自动生成并更新对应的entitlements配置文件
  • 不需要下载、硬编码任何私钥字符串,自动令牌生成的逻辑全由系统接管
正确实现方案

不要直接用原生URLSession发请求,这类请求不会被系统自动注入鉴权头,推荐直接用MusicKit框架提供的请求对象,两种实现方式按需选择:

方案1:用高层MusicKit接口(最推荐,零额外参数处理)

直接用框架自带的目录资源请求能力,不需要手动拼接接口URL,系统会自动匹配对应API端点:

import MusicKit

func fetchSongsByISRC(isrc: String) async throws -> [Song] {
    var request = MusicCatalogSearchRequest(term: "", types: [Song.self])
    request.filter[.isrc] = [isrc]
    let response = try await request.response()
    return Array(response.songs)
}

方案2:直接调用指定API端点

如果你需要完全匹配之前调用的/v1/catalog/us/songs?filter[isrc]={isrc}接口,拿到和自定义数据结构AppleMusicSongDataRoot匹配的原始返回,用MusicDataRequest即可,它会自动注入鉴权令牌:

import MusicKit

func getAppleMusicSongDataByISRC(songISRC: String) async throws -> AppleMusicSongDataRoot {
    guard var urlComponents = URLComponents(string: "https://api.music.apple.com/v1/catalog/us/songs") else {
        throw URLError(.badURL)
    }
    urlComponents.queryItems = [
        URLQueryItem(name: "filter[isrc]", value: songISRC)
    ]
    guard let requestURL = urlComponents.url else {
        throw URLError(.badURL)
    }
    
    let dataRequest = MusicDataRequest(urlRequest: URLRequest(url: requestURL))
    let response = try await dataRequest.response()
    return try JSONDecoder().decode(AppleMusicSongDataRoot.self, from: response.data)
}
注意事项
  • 上述实现全程不需要调用MusicAuthorization.request()申请用户权限,因为访问公开音乐目录不属于用户隐私数据范畴,不会触发权限弹窗;只有当你需要访问用户个人资料库、播放历史、用户自建歌单等私有数据时,才需要申请用户授权
  • 不要手动生成JWT格式的开发者令牌往请求头里硬塞,自动令牌生成是iOS 15+之后官方推荐的标准方案,能避免令牌过期、签名错误等不必要的问题
  • 如果仍然返回401,检查你的开发者账号是否正常开通MusicKit服务,Xcode中登录的开发者账号是否和后台配置App ID的账号一致

内容的提问来源于stack exchange,提问作者Dhruv Weaver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:12:19