UnityWebRequest 在 IL2CPP Build 上什么都不做

UnityWebRequest does nothing on IL2CPP Build

我一直在尝试简单地在 android build 上调用 api 支持 64 位 (IL2CPP build) 和 UnityWebRequest class 似乎没有用。只需单击 ui 按钮即可调用它。它击中 webRequest.SendWebRequest(); 并且没有任何反应。我尝试了以下示例。一,直接来自 UnityWebRequest 和其他使用标准 HttpClient 的 Unity 文档。

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 上运行,而且它们都 return 结果符合我的预期。

接下来我听到的是关于使用 android:usesCleartextTraffic="true"

设置 android 清单应用程序标签

不幸的是,这对我也没有任何帮助,哈哈。我知道它必须是 64 支持,因为它适用于标准 build。当我以 64 支持进入 build 时,它不起作用。

任何关于为什么 return 不适当的帮助都会非常有帮助。

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

所以在解决了很多问题之后,我发现了为什么这不起作用。主要问题似乎源于我使用标准 Newtonsoft Json 包,而 Unity 显然有自己的内部 JsonUtility class。更改后:

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

为此:

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

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

此外,请注意,要正确映射,必须将 JsonUtility.FromJson 键入一个 class,该 class 明确地反映了传入的 json 对象。

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

P.S。 感谢@RetiredNinja 试图提供帮助,而不是仅仅投反对票和说些有价值的话。你太棒了!