Android端Apple MusicKit开发令牌使用及TOKEN_FETCH_ERROR问题咨询
问题根源:你误解了「开发者令牌」的定义
.p8文件是Apple Music开发者私钥,不是直接可用的开发者令牌。你需要用这个私钥生成符合Apple规范的JWT(JSON Web Token),才是createIntentBuilder()方法要求传入的参数。
正确生成开发者令牌的步骤
收集必要信息
- 已获取的
.p8私钥文件 - 私钥对应的
Key ID:生成.p8文件时会显示,也可在开发者后台「Certificates, Identifiers & Profiles」→「Keys」页面找到 - 你的Apple开发者账号
Team ID:在开发者后台首页右上角或「Membership」页面查看
- 已获取的
用私钥生成合规JWT
JWT必须满足以下规则:- 加密算法固定为
ES256(椭圆曲线加密) - Header部分需包含:
{ "alg": "ES256", "kid": "你的Key ID", "typ": "JWT" } - Payload部分需包含:
{ "iss": "你的Team ID", "iat": 当前时间戳(秒级), "exp": 过期时间戳(秒级,最长不超过180天,建议设为1小时) } - 用.p8私钥对Header+Payload的Base64URL编码结果签名,得到完整JWT字符串
- 加密算法固定为
替换代码中的令牌
将生成的JWT字符串填入R.string.developer_token,替换原来的.p8文件内容。
生成JWT的Kotlin代码示例
可以用com.auth0:java-jwt库快速实现:
首先在build.gradle添加依赖:
implementation 'com.auth0:java-jwt:4.4.0'
然后编写生成逻辑:
import com.auth0.jwt.JWT import com.auth0.jwt.algorithms.Algorithm import java.security.KeyFactory import java.security.spec.PKCS8EncodedKeySpec import java.util.* fun generateDeveloperToken( p8Content: String, keyId: String, teamId: String ): String { // 清理.p8内容:去掉首尾标记和换行 val cleanPrivateKey = p8Content .replace("-----BEGIN PRIVATE KEY-----", "") .replace("-----END PRIVATE KEY-----", "") .replace("\\s+".toRegex(), "") // 解码私钥 val keySpec = PKCS8EncodedKeySpec(Base64.getDecoder().decode(cleanPrivateKey)) val privateKey = KeyFactory.getInstance("EC").generatePrivate(keySpec) // 生成JWT val algorithm = Algorithm.ECDSA256(null, privateKey) return JWT.create() .withHeader(mapOf("kid" to keyId, "typ" to "JWT")) .withIssuer(teamId) .withIssuedAt(Date()) .withExpiresAt(Date(System.currentTimeMillis() + 3600 * 1000)) // 1小时过期 .sign(algorithm) }
额外检查项
- 确认.p8密钥已开启「Media Services (MusicKit, ShazamKit, Apple Music Feed)」权限
- 检查Key ID和Team ID大小写、字符是否完全匹配
- 确保JWT过期时间不超过180天,否则Apple会直接拒绝
- 签名算法必须是ES256,不能使用HS256等其他算法
内容的提问来源于stack exchange,提问作者CommonsWare
相关产品推荐
相关产品推荐

