您正在使用http下载。目前Unity将NSAllowsArbitraryLoads添加到Info.plist以简化转换,但它很快就会被删除。

时间:2018-04-29 09:41:23

标签: c# unity3d unityscript

我使用WWW将数据上传到数据库。 我有两个数据对象的数据类。

[Serializable]
public class pushdatawrapper{
    public string email;
    public pushdata[] shotsArray=new pushdata[1];
}
[Serializable]
public class pushdata{
    public string timehappened;
    public string clubtype;     
    public pushdata(string timestamp_,string clubtype_)
    {
        timehappened = timestamp_;
        clubtype = clubtype_;           
    }
}

将数据对象的Json数组加载到数据库,我尝试了两种方法。 第一个是好的,但第二个总是在调用StartCoroutine函数时失败。

First approach

public class BLEBridge : MonoBehaviour {
    void Start () {
       pushdata_ pdata = new pushdata_("123123123123.0","15","123.0","123.0", "123.0", "123.0","123.0", "123.0","123.0","123.0","123.0","123.0", "First");
        pushdatawrapper_ pw = new pushdatawrapper_ ();
        pw.email = "test@gmail.com";
        pw.shotsArray[0] = pdata;
        StartCoroutine (PushData_ (pw));
    }

    private IEnumerator PushData_(pushdatawrapper_ pdata){
        WWW www;
        Hashtable postHeader = new Hashtable();
        postHeader.Add("Content-Type", "application/json");
        string dataToJason = JsonUtility.ToJson(pdata);
        Debug.Log ("dataToJason " + dataToJason);
        // convert json string to byte
        var formData = System.Text.Encoding.UTF8.GetBytes(dataToJason);
        www = new WWW("http://rmotion.rapsodo.com/api/push/new", formData, postHeader);
        StartCoroutine(WaitForRequest(www));
        return www;

    }
    IEnumerator WaitForRequest(WWW data)
    {
        yield return data; // Wait until the download is done
        if (data.error != null)
        {
            Debug.Log("There was an error sending request: " + data.text);
        }
        else
        {
            Debug.Log("WWW Request: " + data.text);
        }
    }

}

这第一种方法总是好的。 但在实际实现中,我需要从静态函数上传数据。那些private IEnumerator PushData_(pushdatawrapper_ pdata) and IEnumerator WaitForRequest(WWW data)不可能是静态的。

所以我做的是 我做了一个单独的课

public class UploadData: MonoBehaviour{
    public void uploadindividualshot(pushdatawrapper pw){       
        StartCoroutine (PushData (pw));


    }

    private IEnumerator PushData(pushdatawrapper pdata){
        WWW www;
        Hashtable postHeader = new Hashtable();
        postHeader.Add("Content-Type", "application/json");
        string dataToJason = JsonUtility.ToJson(pdata);
        Debug.Log ("dataToJason " + dataToJason);
        // convert json string to byte
        var formData = System.Text.Encoding.UTF8.GetBytes(dataToJason);
        Debug.Log ("before www ");
        www = new WWW("http://rmotion.rapsodo.com/api/push/new", formData, postHeader);
        Debug.Log ("after new ");
        StartCoroutine(WaitForRequest(www));
        Debug.Log ("after WaitForRequest ");
        return www;

    }
    IEnumerator WaitForRequest(WWW data)
    {
        Debug.Log ("start pushing ");
        yield return data; // Wait until the download is done
        if (data.error != null)
        {
            Debug.Log("There was an error sending request: " + data.text);
        }
        else
        {
            Debug.Log("WWW Request: " + data.text);
        }
    }

}

然后从静态方法调用类的实例

public class BLEBridge : MonoBehaviour {

    void Start(){}

    public unsafe static void GetGolfREsult()
    {
       pushdata pdata = new pushdata("123123123123.0","15","123.0","123.0", "123.0", "123.0","123.0", "123.0","123.0","123.0","123.0","123.0", "First");
       pushdatawrapper pw = new pushdatawrapper();
       pw.email = Login.loginName;
       pw.shotsArray[0] = pdata;
       UploadData up = new UploadData ();
        up.uploadindividualshot (pw);
    }
}

我总是有错误

after new 
UploadData:PushData(pushdatawrapper)
BLEBridge:GetGolfREsult()

(Filename: /Users/builduser/buildslave/unity/build/artifacts/generated/common/runtime/DebugBindings.gen.cpp Line: 51)

libc++abi.dylib: terminating with uncaught exception of type Il2CppExceptionWrapper
2018-04-29 17:25:25.565292+0800 RMotion[270:7241] You are using download over http. Currently Unity adds NSAllowsArbitraryLoads to Info.plist to simplify transition, but it will be removed soon. Please consider updating to https.

该程序在StartCoroutine(WaitForRequest(www));

时出错

第二种方法有什么问题?

1 个答案:

答案 0 :(得分:-1)

在统一呼叫中,这行代码自动启动http请求

WWW www = new WWW("url");

yield只是告诉协程等待进程完成的便捷方式。不要在2 IEnumerator中分开你的电话。

private IEnumerator PushData_(pushdatawrapper_ pdata){
    WWW www;
    Hashtable postHeader = new Hashtable();
    postHeader.Add("Content-Type", "application/json");
    string dataToJason = JsonUtility.ToJson(pdata);
    Debug.Log ("dataToJason " + dataToJason);
    // convert json string to byte
    var formData = System.Text.Encoding.UTF8.GetBytes(dataToJason);
    www = new WWW("http://rmotion.rapsodo.com/api/push/new", formData, postHeader)
    Debug.Log ("start pushing ");
    yield return www; // Wait until the download is done
    if (www.error != null)
    {
        Debug.Log("There was an error sending request: " + www.text);
    }
    else
    {
        Debug.Log("WWW Request: " + www.text);
    }

}

我在静态方法中没有看到任何指针的使用,为什么你使用unsafe关键字?