Unity问题记录(二) ------ UnityWebRequest进行http/https请求出现问题

错误 :Cleartext HTTP traffic to xxx not permitted

出现原因 :在Android P系统(Android API >= 28)的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。

以下两者解决方式是从APP触发的,不过最好还是web端配置好受信任的证书

unity官方回答 : https://forum.unity.com/threads/unitywebrequest-report-an-error-ssl-ca-certificate-error.617521/#post-4254655

 

解决方式1 : 采用Android OKHttp进行https访问(限制 : Android8.0以上)

①.在build.gradle添加

 implementation "com.squareup.okhttp3:okhttp:3.10.0"

等待下载完成 

Unity问题记录(二) ------ UnityWebRequest进行http/https请求出现问题_第1张图片

②.进行Post异步请求

  public void postDataWithParame(String uri) {
        String[] t = uri.split("%");
        key = t[0];
        uri = t[1];

        OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("username", "zhangsan");//传递键值对参数
        Request request = new Request.Builder()//创建Request 对象。
                .url(uri)
                .post(formBody.build())//传递请求体
                .build();
        client.newCall(request).enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                Log.d("kwwl", "获取数据失败");
            }

            @Override
            public void onResponse(Call call,  Response response) throws IOException {
              //  Log.d("kwwl", "获取数据成功了:"+response.body().string());
                //calldata.setText("获取数据为:" + response.body().string());
                final String data = response.body().string();
                mainHandler.post(new Runnable() {
                    @Override public void run() {
                        //已在主线程中,可以更新UI
                        UnityPlayer.UnitySendMessage("ScriptHolder","RequestBack",key +"%"+ data);
                    }
                });

            }
        });//回调方法的使用与get异步请求相同,此时略。
    }

请注意由于需求,我在传进来的地址前增加了key

③.打包成aar包及依赖包放入unity

Unity问题记录(二) ------ UnityWebRequest进行http/https请求出现问题_第2张图片

调用如下 :

 public void HttpsRequest(string key, string uri, WebRequestTextEvent webRequestGetEvent)
    {
        if (KeyToWebEvent.ContainsKey(key))
        {
            KeyToWebEvent[key] = webRequestGetEvent;
        }
        else
            KeyToWebEvent.Add(key, webRequestGetEvent);
#if UNITY_ANDROID && !UNITY_EDITOR
        jo.Call("postDataWithParame", key + "%" + uri);
#endif
    }

unity与Android相互调用可参考这里:Unity功能记录(五)------ Android studio打包aar包后与unity互相通信

 

解决方式2 : AndroidManifest.xml文件中增加支持明文请求(但是在某些设备上使用WiFi还是会出现无法请求的问题)

android:usesCleartextTraffic="true"

Unity问题记录(二) ------ UnityWebRequest进行http/https请求出现问题_第3张图片

 

参考列表 : 

Cleartext HTTP traffic to xxx not permitted解决办法

Android OKHttp使用详解

Android高版本联网失败报错:Cleartext HTTP traffic to xxx not permitted解决方法

 

 

 

 

 

你可能感兴趣的:(Android,unity)