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 试图提供帮助,而不是仅仅投反对票和说些有价值的话。你太棒了!
我一直在尝试简单地在 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"
不幸的是,这对我也没有任何帮助,哈哈。我知道它必须是 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 试图提供帮助,而不是仅仅投反对票和说些有价值的话。你太棒了!