直接正题
游戏接入某安卓sdk时候,收到发行方的反馈,部分机型无法连接服务器。我手里的测试机是一个小米 安卓系统7.1.1,调试sdk时候一直没问题,一些皆正常。Google浏览器直接请求我们服务器URL也是Ok的。
收集一些发行方反馈无法连接游戏服务器手机系统和机型作出分析判断,应该是安卓这面的问题,因为游戏url都是可以访问,没得问题。我借了一个10.0系统的测试机,运行游戏的确是无法连接服务器。捕获到日志如下异常:
2021-01-06 18:27:53.396 31528-31842/? E/Unity: java.io.IOException: Cleartext HTTP traffic to 客户端url地址.com not permitted (Filename: Line: 433)
2021-01-06 18:27:53.411 31528-31649/? I/Unity: Unknown Error
UnityEngine.DebugLogHandler:LogFormat(LogType, Object, String, Object[])
UnityEngine.Logger:Log(LogType, Object)
<DoHttpGet>c__Iterator0:MoveNext()
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)
根据异常我们得知是http和https的问题,安卓从9.0开始,出于对安全因素的考虑,默认不支持http请求,需要用https。我看了下出c#的代码,游戏的url的确是http拼接的。
方案有两种。方案1:让游戏服务器端配置证书支持https访问请求 。 方案 2:安卓里配置支持http请求。为了方便选择方案2喽,理论上方案1最稳妥,但是比较费时间费钱。
游戏采用的是Unity导出as工程,在as里进行sdk接入,之前考虑过sdk或游戏其中一方采用http请求的情况加过一些设置,但是在安卓10上并没有什么效果。配置代码如下:
<application
android:name="com.game.MyApplication"
android:usesCleartextTraffic="true"
android:theme="@style/UnityThemeSelector"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:isGame="true"
android:roundIcon="@mipmap/app_icon_round">
Application usesCleartextTraffic属性安卓官网说,应用是否打算使用明文网络流量,如明文 HTTP。对于目标 API 级别为 27 或更低级别的应用,默认值为 "true"。对于目标 API 级别为 28 或更高级别的应用,默认值为 "false"。加过此属性但是安卓10+无效
于是在安卓官网找到了另一个方式尝试了一下,安卓中文官网——网络安全配置。文档中介绍需要在res文件夹下新建一个xml文件,在xml文件夹下添加配置(network_security_config.xml)如下(写法简化了,详细去官网看链接上面有):
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true"/>
</network-security-config>
需要在清单文件application属性下加上对应引用,即可。
<application
android:name="com.game.MyApplication"
android:usesCleartextTraffic="true"
android:theme="@style/UnityThemeSelector"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:isGame="true"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/app_icon_round">
经测试安卓多种机型, 已没任何问题,可以正常访问游戏地址。
友情提示:如果有条件情况下,还是要配置好https的可以减少很多安全方面的麻烦
结尾
简简单单记录一下发生错误的过程。结果很重要,但是解决问题的过程也很有趣啊。
网友评论