【问题标题】:App works in Unity editor but not on Android应用可以在 Unity 编辑器中运行,但不能在 Android 上运行
【发布时间】:2019-01-28 04:01:31
【问题描述】:

构建与 PHP/MySQL 后端通信的 Unity 前端应用程序。现在我正在处理它的注册和登录部分。在 Unity 编辑器中,一切正常,在浏览器前端注册也正常。但是,一旦我在 Unity 中构建并构建它以在我的 Google Pixel 手机上进行测试,注册和登录都在我的手机上失败。我在登录时收到的错误消息是“解析服务器响应时出错,请重试!”在我的 UILogin.cs 中。然而,没有其他任何东西。我尝试按照 Unity 文档进行调试、adb 和 DDMS 以了解正在发生的事情,但我在所有这些冒险中都失败了。 Android 和 WWW 对象或 Web 通信有什么特别不同的地方吗?这是我的 UILogin.cs 的一部分,还将包括 Login.php。

UILogin.cs

IEnumerator AttemptLogin(bool quickLogin)
    {
        CreateLoadingScreen();
        DeactivateForm();
        WWWForm form = new WWWForm();
        form.AddField("email", Email.text);
        form.AddField("password", Password.text);

        WWW www = new WWW(URL.GetLoginURL, form);
        yield return www;

        DestroyLoadingScreen();
        ActivateForm();
        ParseResult(www.text, quickLogin);
    }

    void ParseResult(string result, bool quickLogin)
    {
        byte resultCode;
        if (!byte.TryParse(result, out resultCode))
            Result.text = "Error parsing response from server, please try again!";
        else if (resultCode == 0)
        {
            if (RememberToggle.isOn && !quickLogin) // Remember me
            {
                PlayerPrefs.SetInt("remember", 1);
                PlayerPrefs.SetString("email", Email.text);
                PlayerPrefs.SetString("password", Password.text);
            }
            else if (!quickLogin)
            {
                TemporaryAccount.Email = Email.text;
                TemporaryAccount.Password = Password.text;
            }

            SceneManager.LoadScene(3);
        }
        else // Failure
        {
            if (quickLogin)
                ShowForm();

            Result.text = WebError.GetLoginError(resultCode);
        }
    }

Login.php

<?php
    require "conn.php";

    $stmt = $pdo->prepare("SELECT * FROM account WHERE email=:email");
    $stmt->bindParam(":email", $_POST['email']);
    $stmt->execute();
    $count = $stmt->rowCount(); // gets count of records found

    if($count > 0) {
        $result = $stmt->fetch(); // gets resultset
        if(!password_verify($_POST['password'], $result[4]))
            echo "2";
        else
            echo "0";
    }
    else {
        echo "1";
    }
?>

有什么想法吗?

更新 #1 我在 yield return www 之后打印了 www.text 和 www.error;文本为空,错误提示:未知错误。

更新 #2 有趣的是,我也从中得到了未知错误:

Clickme.cs

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class Clickme : MonoBehaviour
{
    public Text Result;

    public void OnClick()
    {
        StartCoroutine(RunScript());
    }

    IEnumerator RunScript()
    {
        WWW www = new WWW("http://www.familypolaris.com/helloWorld.php");
        yield return www;

        if (www.text == "")
            Result.text = "Result was empty, error: " + www.error;
    }
}

HelloWorld.php

<?php
    echo "Hello World!";
?>

【问题讨论】:

  • 您应该做的第一件事是打印收到的数据www.text,看看它是否真的收到了预期的数据。我怀疑它在Android上确实如此。第二件事是打印错误www.error。如果您的请求中有错误,您必须在处理或使用收到的数据之前check。用结果更新你的问题。
  • 好的,我做到了并更新了我的问题。在 yield 之后打印 www.text 和 www.error 的结果是:www.text 是空的。 www.error 说:“未知错误”
  • 那是你的问题。 WWW 请求失败。在Android上登录URL.GetLoginURL的值是多少?
  • 这里有一些有趣的事情。所以我通过超级简化来测试它。我也收到此代码的未知错误:我将用它更新我的问题,请稍等。好的,添加了更新 #2。我认为我们不能比这更简化代码了!哈哈哈。然而,即使在这个简单的代码中,“未知错误”仍然存在。
  • 另外URL是我创建的一个类,不是官方的类。 URL.GetLoginURL 是一个访问器,它返回这个字符串:familypolaris.com/login.php(stackOverflow 杀死了 h t t p : // w w w 的一部分,但它就在那里。)

标签: c# php android mysql unity3d


【解决方案1】:

我想通了,所以我会在这里发布答案。在有人评论说他们尝试了我的代码并且效果很好之后,我决定在这里尝试另一种设备。该设备也无法注册和登录。这告诉我我的构建设置有问题。我的第一个想法是将构建类型从 Gradle 切换到 Internal,这立即解决了我的两个设备的问题。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多