0

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

UnityWeb请求:

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 manifest 应用程序标签android:usesCleartextTraffic="true"

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

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

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

4

1 回答 1

0

因此,经过大量故障排除后,我发现了为什么这不起作用。主要问题似乎源于我使用标准的 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 对象的类。

最终帮助我解决此问题的页面文章在这里

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

于 2020-07-15T05:13:00.567 回答