小程序和小游戏网络相关 API 使用方式相同, 所以我们用网络接口来统称
# 不同平台的错误返回规则
# Android
cronet 的错误返回可以参考: https://chromium.googlesource.com/chromium/src/+/master/net/base/net_error_list.h
WebSocket 接口常见错误
名称 | 含义 |
---|---|
Underlying Transport Error | 异常, 大概率无网络引起 |
Timer Expired | 超时, 弱网或无网 |
The total timed out | 超时, 弱网或无网 |
TLS handshake failed | tls 协商失败 |
TLS handshake timed | tls 协商超时, 可以考虑重试 |
Invalid HttpCode | 服务器配置有误 |
# iOS
cronet 的错误返回参考同 Android
upload 一般返回汉语信息加上 kcferrordomaincfnetwork 可以直接在苹果开发者官网上搜索到具体的对应错误信息, 协助分析解决
# ipv6 慢的问题
Android HttpURLConnection 是按照 RFC 3484 顺序尝试每个 ip 地址, 这里应该是 v6 优先, 但是系统尝试 v6 连接时超时就会按顺序再去尝试 v4, 虽然最后也有可能在设置的 60s 超时时间内完成, 但是整体耗时还是变长了, 现象就是 request 接口的请求时间很长. 在客户端 7.0.10 版本切换 cronet 后已经解决此问题
# 证书问题
证书的注意事项已有文档说明: https://developers.weixin.qq.com/minigame/dev/guide/base-ability/network.html
- 证书过期或无效
可以通过 https://myssl.com/ssl.html 或其他在线工具验证, 因为 Android 手机的兼容性问题, 验证结果并不保证对所有 Android 机器都有效
- 证书链不完整
Android 的根证书不全, 如果服务器是使用中间证书, 而 Android 手机上又找不到相应的根证书, 就会出现相关的 SSL 错误, 此时需要服务器配置完整证书链
- wss 协议走 80 端口不成功
80 端口对应 http 默认不做证书校验, wss 应当选用 443 端口
# not in domain url
请求 url 不在域名列表中, 遇到这个问题有几种可能
- 请求 url 不在 mp 配置的域名列表里
- 重定向后的 url 不在域名列表里
- websocket 请求的端口没有配置
- 配置的域名未生效 (极低概率)
# network is down
iOS 14 系统新增了本地网络开关, 如果关闭则局域网不通, 系统接口报错 network is down, 目前系统未提供检测开关方法, 开发者需要根据错误信息提示用户打开权限