UnityWebRequest.SendWebRequest не отправляется на мобильный - PullRequest
0 голосов
/ 01 октября 2018

Я загружаю наборы активов с помощью метода UnitywebRequest из HTTPS, однако UnityWebRequest.SendWebRequest, похоже, не торопится, чтобы фактически начать получать любые данные.

public static IEnumerator DownloadMenuAssetBundle(string fileName)
{
    string path = Path.Combine(Globals.Platform, fileName);
    UnityWebRequest www = new UnityWebRequest(FileManager.RequestFile(path));//this returns the complete url to the bundle e.g https://mywebsite.com/unity/myBundle
    www.downloadHandler = new DownloadHandlerBuffer();
    www.SendWebRequest();
    while (!www.isDone)
    {
        Debug.Log("response: " + www.responseCode);
        if (www.isNetworkError)
        {
            Debug.Log(www.error);
        }
        Debug.Log("downloaded:" + www.downloadedBytes);
        yield return null;
    }
    Debug.Log("downloaded bytes: " + www.downloadedBytes);
    Debug.Log("final response:" + www.responseCode);

    if (www.error != null)
    {
        Debug.LogError("Encountered error while downloading: <color=blue>" + fileName + "</color>: " + www.error);
    }
    else
    {
       //rest of the logic, this works
    } 

Debug.Log("response: " + www.downloadedBytes); вернет 0 дляслучайное количество времени (от нескольких до нескольких минут).Но www. isNetworkError никогда не срабатывает, и как только байты начнут поступать, он загрузит все это за пару миллисекунд.

Раньше я использовал тот же сценарий на http-сервере, и он работал без сбоев без каких-либо задержек, но как только я переключился на https, это заняло некоторое время.Задержка также не происходит в редакторе (Unity version 2017.2.1f1 runtime версия .net 3.5 с совместимостью api 2.0 subset), но происходит на всех моих мобильных устройствах (Oneplus 3, Samsung Galaxy S8, Samsung Galaxy S6).

Сначала www.responseCode вернул 301 Moved Permanently, я решил эту проблему, используя новый URL-адрес https вместо http-адреса, надеясь, что это исправит это.Однако это не так, и теперь я получаю только 200 OK.

Это также противоречивая проблема, потому что время, которое она занимает, не всегда одинаково, и даже не происходит постоянно (но чаще всеговремени)

Может ли это быть проблемой из-за того, что уровень безопасности требует дополнительного времени или сервер не торопится с ответом?если это проблема, как бы я мог отследить это (хотя я сомневаюсь, что это хорошо работает в редакторе)?

РЕДАКТИРОВАТЬ: обходной путь Я обошел проблему с помощьюWWW класс вместо UnityWebRequest.задержка полностью исчезла, но проверка SSL-сертификата не выполняется, так как Unity, по-видимому, запрещает их по умолчанию.Я бы не назвал это исправлением, но пока работает.

1 Ответ

0 голосов
/ 01 октября 2018

Всегда проблемы с UnityWebRequest - иногда с UnityWebRequests ничего не имеет смысла ...

Вы можете попробовать заменить

 UnityWebRequest www = new UnityWebRequest(FileManager.RequestFile(path));

на

 UnityWebRequest www = new UnityWebRequestAssetBundle(FileManager.RequestFile(path), 0);

Необязательно для тестирования:

Также я думаю, что ваш цикл while не "сохранить", чтобы поймать ошибку сети.Я бы предпочел следующее, как упомянуто в документации

UnityWebRequest www = new UnityWebRequestAssetBundle(FileManager.RequestFile(path);
yield return www.SendWebRequest();

if (request.isNetworkError || request.isHttpError)
{
    Debug.Log(www.error.ToString());
}
else
{
    // for testing only // if yield return www.SendWebRequest(); is working as expected www.isDone = true here!
    while (!www.isDone)
    {
        Debug.Log("Something is wrong! "  + www.responseCode);
        yield return new WaitForSeconds(0.1f);
    }
    // do whatever you want
}

Надеюсь, это поможет.

...