unitywebrequest 函数的未知错误
unknown error with the unitywebrequest function
我正在做一个 apk,当我 运行 它在我的手机 phone 上时,出现以下错误
"Unknow error"
但最奇怪的是,如果我从unity 运行它时它正常工作,我使用以下代码向我展示了我在我的单元格phone上执行它时的错误是什么因为在 unity 中工作得很好
IEnumerator logIn(WWWForm form)
{
using (UnityWebRequest webRequest = UnityWebRequest.Post("http://localhost:3000/login", form))
{
yield return webRequest.SendWebRequest();
if (webRequest.isNetworkError )
{
Debug.Log(webRequest.error);
advertencia.SetActive(true);
advertencia.GetComponent<Text>().text=webRequest.error+"1";
}
else if (webRequest.isHttpError)
{
advertencia.SetActive(true);
advertencia.SetActive(true);
advertencia.GetComponent<Text>().text = webRequest.error+"2";
}
else
{
SceneManager.LoadScene("Principal");
}
}
}
使用以下代码检查我的 apk 是否连接到互联网,如果它连接到互联网则显示文本
private void Update()
{
if (Application.internetReachability == NetworkReachability.NotReachable)
{
advertencia.SetActive(true);
Debug.Log("Error. Check internet connection!");
}
}
代码更完整一点:
private Text userText;
private InputField password;
public GameObject advertencia;
private void Start()
{
userText = GameObject.Find("UserInput").GetComponent<Text>();
password = GameObject.Find("PasswordInput").GetComponent<InputField>();
advertencia = GameObject.Find("Advertencia");
advertencia.SetActive(false);
}
//the function with which the corrutina invoked
public void Log()
{
Debug.Log("Usuario : " + userText.text + "\nContraseña : " + password.text);
WWWForm form = new WWWForm();
form.AddField("codigo", userText.text);
form.AddField("contrasena", password.text);
StartCoroutine(logIn(form));
}
问题
您使用URL
http://localhost:3000/login
您正在尝试将 Web 请求发送到主机 localhost
。这适用于您的 PC Unity,因为 PC 是您尝试联系的服务器。
服务器不在您的 phone 上 运行,但您的 phone 正在尝试将请求发送到端口 本身 =12=] 这显然会失败。
阅读更多关于What is a localhost?
解决方案
将 localhost
替换为 IP 或 network address 您的 server/PC 实际拥有并且您应该没问题。
要找出您 PC 的 IP,请使用例如
- Linux/Unix:在终端调用中
ifconfig
- Windows: 在CMD中调用
ipconfig
当然你的 PC 和 phone 也必须在同一个网络中或至少被路由以便你的 phone 可以到达 server/PC 在给定的 IP/network 地址.
可能您还必须配置 PC 的防火墙以允许该端口上的传入流量。
如果您在移动设备上 运行 此代码,那么您应该更改主机名。您不能在边缘设备中使用 localhost。因此,您必须输入后端服务器所在计算机的 IP 地址,而不是 localhost
。
获取IP地址,
执行命令 prompt/terminal 然后键入以下命令,
对于Windows机器
ipconfig
对于Linux/Mac机器
ifconfig
然后获取 IPv4 地址并像这样用此 IP 替换 localhost,
using (UnityWebRequest webRequest = UnityWebRequest.Post("http://192.168.1.9:3000/login", form))
您必须确保电脑(其中服务器为运行)和移动设备连接到同一网络。您只需通过 wifi 网络连接所有设备即可。
如果您在 Android9 上使用 运行 的移动设备,Pie(API 级别 27+) 或更高版本的操作系统,则必须在 AndroidManifest.xml
文件中指定 android:usesCleartextTraffic="true"
。
因此,单击播放器设置 --> 发布设置 --> 检查自定义清单模板。您可以像这样在清单文件中添加 android:usesCleartextTraffic="true"
,
<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true"
...>
...
</application>
</manifest>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true" android:usesCleartextTraffic="true">
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
我正在做一个 apk,当我 运行 它在我的手机 phone 上时,出现以下错误
"Unknow error"
但最奇怪的是,如果我从unity 运行它时它正常工作,我使用以下代码向我展示了我在我的单元格phone上执行它时的错误是什么因为在 unity 中工作得很好
IEnumerator logIn(WWWForm form)
{
using (UnityWebRequest webRequest = UnityWebRequest.Post("http://localhost:3000/login", form))
{
yield return webRequest.SendWebRequest();
if (webRequest.isNetworkError )
{
Debug.Log(webRequest.error);
advertencia.SetActive(true);
advertencia.GetComponent<Text>().text=webRequest.error+"1";
}
else if (webRequest.isHttpError)
{
advertencia.SetActive(true);
advertencia.SetActive(true);
advertencia.GetComponent<Text>().text = webRequest.error+"2";
}
else
{
SceneManager.LoadScene("Principal");
}
}
}
使用以下代码检查我的 apk 是否连接到互联网,如果它连接到互联网则显示文本
private void Update()
{
if (Application.internetReachability == NetworkReachability.NotReachable)
{
advertencia.SetActive(true);
Debug.Log("Error. Check internet connection!");
}
}
代码更完整一点:
private Text userText;
private InputField password;
public GameObject advertencia;
private void Start()
{
userText = GameObject.Find("UserInput").GetComponent<Text>();
password = GameObject.Find("PasswordInput").GetComponent<InputField>();
advertencia = GameObject.Find("Advertencia");
advertencia.SetActive(false);
}
//the function with which the corrutina invoked
public void Log()
{
Debug.Log("Usuario : " + userText.text + "\nContraseña : " + password.text);
WWWForm form = new WWWForm();
form.AddField("codigo", userText.text);
form.AddField("contrasena", password.text);
StartCoroutine(logIn(form));
}
问题
您使用URL
http://localhost:3000/login
您正在尝试将 Web 请求发送到主机 localhost
。这适用于您的 PC Unity,因为 PC 是您尝试联系的服务器。
服务器不在您的 phone 上 运行,但您的 phone 正在尝试将请求发送到端口 本身 =12=] 这显然会失败。
阅读更多关于What is a localhost?
解决方案
将 localhost
替换为 IP 或 network address 您的 server/PC 实际拥有并且您应该没问题。
要找出您 PC 的 IP,请使用例如
- Linux/Unix:在终端调用中
ifconfig
- Windows: 在CMD中调用
ipconfig
当然你的 PC 和 phone 也必须在同一个网络中或至少被路由以便你的 phone 可以到达 server/PC 在给定的 IP/network 地址.
可能您还必须配置 PC 的防火墙以允许该端口上的传入流量。
如果您在移动设备上 运行 此代码,那么您应该更改主机名。您不能在边缘设备中使用 localhost。因此,您必须输入后端服务器所在计算机的 IP 地址,而不是
localhost
。获取IP地址,
执行命令 prompt/terminal 然后键入以下命令,
对于Windows机器
ipconfig
对于Linux/Mac机器
ifconfig
然后获取 IPv4 地址并像这样用此 IP 替换 localhost,
using (UnityWebRequest webRequest = UnityWebRequest.Post("http://192.168.1.9:3000/login", form))
您必须确保电脑(其中服务器为运行)和移动设备连接到同一网络。您只需通过 wifi 网络连接所有设备即可。
如果您在 Android9 上使用 运行 的移动设备,Pie(API 级别 27+) 或更高版本的操作系统,则必须在
AndroidManifest.xml
文件中指定android:usesCleartextTraffic="true"
。因此,单击播放器设置 --> 发布设置 --> 检查自定义清单模板。您可以像这样在清单文件中添加
android:usesCleartextTraffic="true"
,<?xml version="1.0" encoding="utf-8"?> <manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <application ... android:usesCleartextTraffic="true" ...> ... </application> </manifest>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" android:installLocation="preferExternal" android:versionCode="1" android:versionName="1.0"> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true" android:usesCleartextTraffic="true"> <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>