UnityWebRequest嵌入用于HTTP基本身份验证的用户密码数据不适用于Android

UnityWebRequest嵌入用于HTTP基本身份验证的用户密码数据不适用于Android

问题描述:

以下代码用于从我们自己的系统中托管的Thingworx服务器获取温度值。 这在团结完美。 但不是在andoird中,一旦生成apk,它将不会从服务器获取任何数据,并且会建立连接。但是,它只是不会获取数据并将其放入文本网格中。UnityWebRequest嵌入用于HTTP基本身份验证的用户密码数据不适用于Android

我使用统一5.4.1 32位。检查同时在Android - 5.0.2和6

using UnityEngine; 
using System.Collections; 
using UnityEngine.Networking; 
using System.Text.RegularExpressions; 
using System; 
using UnityEngine.UI; 

public class GETTempValue : MonoBehaviour { 


public GameObject TempText; 
static string TempValue; 

void Start() 
{ 
    StartCoroutine(GetText()); 
} 

IEnumerator GetText() 
{ 
    Debug.Log("Inside Coroutine"); 
    while (true) 
    { 
     yield return new WaitForSeconds(5f); 
     string url = "http://Administrator:[email protected]*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/"; 

     Debug.Log("Before UnityWebRequest"); 
     UnityWebRequest www = UnityWebRequest.Get (url); 
     yield return www.Send(); 
     Debug.Log("After UnityWebRequest"); 
     if (www.isError) { 
      Debug.Log ("Error while Receiving: "+www.error); 
     } else { 
      Debug.Log("Success. Received: "+www.downloadHandler.text); 
      string result = www.downloadHandler.text; 
      Char delimiter = '>'; 

      String[] substrings = result.Split(delimiter); 
      foreach (var substring in substrings) 
      { 
       if (substring.Contains ("</TD")) 
       { 
        String[] Substrings1 = substring.Split ('<'); 
        Debug.Log (Substrings1[0].ToString()+"Temp Value"); 
        TempValue = Substrings1 [0].ToString(); 
        TempText.GetComponent<TextMesh>().text = TempValue+"'C"; 
       } 
      } 
     } 

    } 

} 

} 

这是Android清单许可

uses-permission android:name="android.permission.INTERNET" 
uses-permission android:name="android.permission.CAMERA" 
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" 
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
+0

你并不需要包括允许一个清单,以便使用'UnityWebRequest'。请删除该权限。 Unity会为你生成它。至于你的问题,所提供的信息不足以帮助你。您需要在'return return www.Send()'之后并在'if(www.isError)'声明中放置Debug.Log。这将帮助我们知道你失败的地方。编辑并在你的问题中包含这个。另外,这是一个本地服务器? – Programmer

+0

@Programmer是的,它是一个本地服务器,它是公开的。我从上面的代码从这个答案我的[问题](http://stackoverflow.com/questions/39031641/retrieving-data-from-rest-api-in-unity-without-lag-or-jitter-using- c-sharp/39031840?noredirect = 1#comment65749849_39031840)。你在调试日志中想要什么,这有助于解决问题?我很乐意为您提供更多信息。 –

+0

我用'Debug.Log'更新了这个问题。运行该程序,然后编辑问题并将日志放在它下面。如果您可以公开您的服务器并提供网址,我也可以尝试一下,看看有什么不对。 – Programmer

在URL中嵌入用户名和密码(http://username:[email protected])在一些应用和操作系统不再支持出于安全原因。这是因为这不是执行HTTP身份验证的标准方式。 Unity或Android很可能没有实现这一点。

我在内置Android浏览器上用http://Administrator:[email protected]*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/进行了测试,结果失败。所以,我猜这个问题来自Android。

我再次测试没有用户名和密码http://*IP Address**:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/然后出现登录窗口。当我输入用户名和密码时,它工作。

你仍然可以使用UnityWebRequest通过提供AUTHORIZATION头到UnityWebRequestSetRequestHeader功能来解决这个问题。这只适用于授权类型为Basic而不是Digest。在你的情况下,它是HTTP Basic

对于一般的解决方案:

string authenticate(string username, string password) 
{ 
    string auth = username + ":" + password; 
    auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth)); 
    auth = "Basic " + auth; 
    return auth; 
} 

IEnumerator makeRequest() 
{ 
    string authorization = authenticate("YourUserName", "YourPassWord"); 
    string url = "yourUrlWithoutUsernameAndPassword"; 


    UnityWebRequest www = UnityWebRequest.Get(url); 
    www.SetRequestHeader("AUTHORIZATION", authorization); 

    yield return www.Send(); 
    ....... 
} 

对于你的问题的解决方案:

public GameObject TempText; 
static string TempValue; 

void Start() 
{ 
    StartCoroutine(GetText()); 
} 

string authenticate(string username, string password) 
{ 
    string auth = username + ":" + password; 
    auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth)); 
    auth = "Basic " + auth; 
    return auth; 
} 

IEnumerator GetText() 
{ 
    WaitForSeconds waitTime = new WaitForSeconds(2f); //Do the memory allocation once 

    string authorization = authenticate("Administrator", "ZZh7y6dn"); 
    while (true) 
    { 
     yield return waitTime; 
     string url = "http://*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/"; 


     UnityWebRequest www = UnityWebRequest.Get(url); 
     www.SetRequestHeader("AUTHORIZATION", authorization); 
     yield return www.Send(); 

     if (www.isError) 
     { 
      Debug.Log("Error while Receiving: " + www.error); 
     } 
     else 
     { 
      string result = www.downloadHandler.text; 
      Char delimiter = '>'; 

      String[] substrings = result.Split(delimiter); 
      foreach (var substring in substrings) 
      { 
       if (substring.Contains("</TD")) 
       { 
        String[] Substrings1 = substring.Split('<'); 
        Debug.Log(Substrings1[0].ToString() + "Temp Value"); 
        TempValue = Substrings1[0].ToString(); 
        TempText.GetComponent<TextMesh>().text = TempValue + "'C"; 
       } 
      } 
     } 
    } 
} 
+0

而不是做所有这些字符串操作,请考虑在Unity中的Json。这比你的代码中的所有字符串操作都强大得多。 [Json文档](https://docs.unity3d.com/ScriptReference/JsonUtility.html)和[Json派生示例](http://stackoverflow.com/questions/36239705/deserialization-of-json-using-minijson- in-unity-c-sharp/36244111#36244111) – Programmer

+0

非常感谢您的帮助。有效 !!! –