【问题标题】:UnityWebRequest does nothing on IL2CPP BuildUnityWebRequest 在 IL2CPP Build 上什么都不做
【发布时间】:2020-06-11 01:13:33
【问题描述】:

我一直试图在支持 64 位(IL2CPP 构建)的 android 构建上简单地调用 api,而 UnityWebRequest 类似乎不起作用。它是通过一个简单的 ui 按钮单击来调用的。它击中webRequest.SendWebRequest(); 并且没有任何反应。我尝试了以下示例。一,直接来自 UnityWebRequest 的 Unity 文档和其他使用标准 HttpClient 的文档。

UnityWebRequest:

IEnumerator GetRequest(string uri)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        {
            webRequest.SetRequestHeader("Authorization", "Bearer " + API_KEY);
            yield return webRequest.SendWebRequest();
            if (webRequest.isNetworkError)
            {
                debugText.text = ": Error: " + webRequest.error;
                coroutineAllowed = false;
            }
            else
            {
                debugText.text = ":\nReceived: " + webRequest.downloadHandler.text;

                dynamic jsonObj = JsonConvert.DeserializeObject(webRequest.downloadHandler.text);
                foreach (var obj in jsonObj["businesses"])
                {
                    businessResults.Add(new Business()
                    {
                        name = (string)obj["name"],
                        image_url = (string)obj["image_url"],
                        review_count = (string)obj["review_count"],
                        rating = (string)obj["rating"],
                        Coordinates = new Coordinates()
                        {
                            Latitude = (float)obj["coordinates"]["latitude"],
                            Longitude = (float)obj["coordinates"]["longitude"]
                        },
                        price = (string)obj["price"]
                    });
                }
                debugText.text = businessResults.Count.ToString();
                //coroutineAllowed = true;
            }
            debugText.text = "getRequest 4";
        }
    }

不幸的是,这对yield return webRequest.SendWebRequest(); 没有任何作用

我尝试的下一个示例是使用 HttpClient():

IEnumerator HttpClientCall(string uri) //possibly wrap in IEnumerator
    {
        debugText.text += "http coroutine started" +Environment.NewLine;
        using (var httpClient = new HttpClient())
        {
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", API_KEY);

            var response = httpClient.GetAsync(uri);
            if (response.Result.StatusCode != HttpStatusCode.OK)
            {
                debugText.text += "FAILED HTTP GET";
            }
            yield return response.Result.Content.ReadAsStringAsync();
            dynamic jsonObj = JsonConvert.DeserializeObject(response.Result.Content.ReadAsStringAsync().Result);
            foreach (var obj in jsonObj["businesses"])
            {
                businessResults.Add(new Business()
                {
                    name = (string)obj["name"],
                    image_url = (string)obj["image_url"],
                    review_count = (string)obj["review_count"],
                    rating = (string)obj["rating"],
                    Coordinates = new Coordinates()
                    {
                        Latitude = (float)obj["coordinates"]["latitude"],
                        Longitude = (float)obj["coordinates"]["longitude"]
                    },
                    price = (string)obj["price"]
                });
                debugText.text += Environment.NewLine + ((string)obj["name"]);
            }
        }
    }

再一次,当它点击yield return response.Result.Content.ReadAsStringAsync();时什么都没有

这些都可以在 PC 上运行,并且它们都返回了我期望的结果。

接下来我听到的是关于使用 android:usesCleartextTraffic="true" 设置 android manifest 应用程序标签

不幸的是,这对我也没有用,哈哈。我知道它必须是 64 支持,因为这适用于标准构建。当我使用 64 支持构建时,它不起作用。

任何关于为什么它没有正确返回的帮助都会非常有帮助。

旁注,我知道代码很丑陋,但是在我弄清楚为什么构建在设备上不起作用之后,将进行大量重构。提前致谢!

【问题讨论】:

  • 你使用的是http还是https?
  • @RetiredNinja 我正在使用 https,api 也是如此。没有使用 http 的选项。我知道问题出在我用来调用这些端点的方法中。我什至尝试使用异步方法而不是 Coroutine 但没有骰子来使用 api。
  • 我更担心您使用的是 http 并因此阻止了请求。也许尝试向其他主机发出请求,看看您是否仍然有同样的问题。 example.com 会起作用。

标签: android unity3d httpclient unitywebrequest


【解决方案1】:

所以经过大量的故障排除后,我发现了为什么这不起作用。主要问题似乎源于我使用标准的 Newtonsoft Json 包,而 Unity 显然有自己的内部 JsonUtility 类。更改后:

dynamic jsonObj = JsonConvert.DeserializeObject(response.Result.Content.ReadAsStringAsync().Result);

到这里:

var js = JsonUtility.FromJson<T>(response.Result.Content.ReadAsStringAsync().Result);

我的结果最终正确显示在 apk 构建中。

另外,要注意要正确映射,必须将 JsonUtility.FromJson 键入到一个明确地反映传入 json 对象的类。

最终帮助我解决这个问题的页面文章是here

附: 感谢@RetiredNinja 试图提供帮助,而不是仅仅投反对票并且不说任何有价值的东西。你太棒了!

【讨论】:

    猜你喜欢
    • 2018-07-13
    • 2012-06-10
    • 1970-01-01
    • 2019-01-14
    • 2018-05-04
    • 2023-04-04
    • 1970-01-01
    • 2015-10-06
    • 2015-09-24
    相关资源
    最近更新 更多