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>