开放平台面向的是硬件厂商与第三方应用,接入方式基于 OAuth 2.0 授权码模式。和很多平台的「一次授权全量开放」不同,这里把权限拆成了四项,授权页上逐项列出,用户可以单独拒绝其中任意一项。
我们跟着一家车机方案商走完了一次完整接入,从申请应用、配置回调地址,到联调播放控制与状态回调,前后用了 11 个工作日。下面把权限设计、限流规则和实际踩到的坑写清楚。
四类权限,车机只用两项
四项权限分别是:读取播放状态、控制播放(播放/暂停/上一首/下一首/音量)、曲库检索(关键词搜索与详情)、读取歌单。车机场景只需要前两项,因为车机的交互以方向盘按键与语音控制为主,搜索通常由手机端完成后再投送。
语音助手类应用会多申请「曲库检索」,用于「播放周杰伦的晴天」这类指令;智能音箱则往往四项全要,因为它要支持「放我收藏的歌单」。权限申请得越多,授权页越长,用户拒绝的概率越高,这是接入方需要自己权衡的。
| 权限项 | 车机 | 智能音箱 | 语音助手 | 说明 |
|---|---|---|---|---|
| 读取播放状态 | 需要 | 需要 | 需要 | 曲名、歌手、进度、播放态 |
| 控制播放 | 需要 | 需要 | 需要 | 含音量与切歌 |
| 曲库检索 | 可选 | 需要 | 需要 | 关键词搜索、专辑详情 |
| 读取歌单 | 不建议 | 需要 | 可选 | 涉及用户收藏内容 |
授权页的文案也影响通过率。方案商把「读取歌单」的理由从「用于个性化推荐」改成「用于播放你的收藏歌单」后,该权限的授权率从 61% 升到 84%。用户不是不愿意给,而是要知道给了换什么。
限流与重试:600 次每分钟怎么算
限流按应用维度计算,单应用每分钟 600 次调用,超限返回 HTTP 429,响应头里带 Retry-After,单位是秒。这个额度看起来不多,实际够用:播放状态轮询每 5 秒一次,一分钟 12 次;控制接口按用户操作触发,峰值也就几十次。
真正容易超的是状态回调。车机在熄屏、切后台、网络重连时都会重新拉一次全量状态,如果实现成「每个界面各拉一次」,一分钟能打到上百次。我们的做法是在应用内做一层缓存与合并,同一秒内的重复请求只发一次。
| 接口 | 触发方式 | 估算频次 | 备注 |
|---|---|---|---|
| 获取播放状态 | 轮询 | 12 次/分钟 | 建议 5 秒间隔 |
| 控制播放 | 用户操作 | 3~8 次/分钟 | 含方向盘按键 |
| 曲库检索 | 语音指令 | 1~3 次/分钟 | 按需 |
| 状态回调 | 事件推送 | 0.5 次/分钟 | 由服务端推送 |
token 有效期 30 天,refresh token 有效期 90 天。刷新接口本身也计入限流,所以不要在每次请求前都刷一次,而是记录过期时间,提前 5 分钟刷新,并做好并发去重——多个线程同时发现过期会一起刷,直接把额度打满。
「限流不是防你,是防你的重试逻辑。绝大多数超限都发生在客户端自己写错的循环里。」——开放平台接入文档中的一句话
三个接入时踩过的坑
第一个坑是回调地址必须完全一致,包括结尾斜杠与端口。测试环境用了 8080,生产环境换成 443,忘了改配置,授权码换 token 一直报 invalid_grant,排查了半天。
第二个坑是时间戳。状态回调的签名里带时间戳,服务端允许前后 5 分钟的偏差。车机系统时间没联网校准时可能差十几分钟,签名全部失败。接入方需要在开机时强制做一次 NTP 同步。
第三个坑是播放控制的幂等。方向盘按键容易连击,长按「下一首」会连发五六个请求,客户端表现为跳好几首。开放平台没有做去重,需要接入方在 300ms 内合并同类型请求。
接入完成后,车机端能做到「上车自动续播、方向盘切歌、仪表盘显示曲名」,全程不碰手机。这类体验的门槛不在技术,而在权限设计与异常处理是否扎实。想了解客户端的音频参数,可以看功能页;安装包在下载页。
用户评论(4 条)
时间戳那个坑我们也踩了,车机没联网,签名全废,查了两天。
600 次其实够,就是刷新 token 并发那下容易超,加个锁就好。
授权文案影响真大,我们改了一句,通过率涨了 20 多个点。
作为用户,最烦的是授权页一长串权限,看到「读取歌单」就不想点了。