最近發現unity在ios平臺使用UnityWebRequest會偶爾出現無回應的情況,明明發送了webRequest請求但一直卡住在請求的協程或者開異步行程的請求中,不會繼續執行下去,而且這個問題只會在ios出現,在android或者pc平臺是復現不了,一開始以為是自己代碼的原因,但把請求從頭到尾都debug輸出過一遍后,發現代碼是沒錯的,但web請求偶爾還是會卡住,即使設定了超時時間也一樣,而且只要一出現這種情況,之后的webrequest請求都會卡在同一個地方,
附上代碼:
public async UniTask DownloadSceneJsonRequest(string sceneId, string path)
{
Debug.Log("=========enter DownloadSceneJsonRequest");
var uri = new Uri(_domain + SceneApi + sceneId);
var uwr = new UnityWebRequest(uri, UnityWebRequest.kHttpVerbGET)
{
downloadHandler = new DownloadHandlerFile(path),
timeout=10,
useHttpContinue=false
};
Debug.Log("========= SendWebRequest+"+ _domain + SceneApi + sceneId);
await uwr.SendWebRequest();
//并沒有以下輸出
Debug.Log("========= complete SendWebRequest");
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log(uwr.error);
}
uwr.Dispose();
}
總的來概括這個問題就是:只在ios平臺,使用unitywebrequest請求時,會偶發出現卡住webrequest請求無回應的情況,但沒有必現規律,而且一旦出現,則后面的請求都會被阻斷無回應,而且這跟unity的版本無關,在unity2019.3.0 unity2019.3.13 unity2019.4.19 unity2020.1.13都會出現一樣的情況,
后面總算在unity的官方論壇中找到了一樣的情況,而且都是使用了ARFoundation與UnityWebrequest,附上帖子的鏈接:https://forum.unity.com/threads/unitywebrequests-on-ios-sometimes-get-stuck-indefinitely-even-with-timeout-set.1012276/
原來是兩個原因導致了這種情況:
1.使用了ARFoundation
2.在高于ios14.1(不包括)版本上使用app
根據外國網友的反饋,ARFoundation的ARSession腳本也發送unitywebrequest請求,當AR在Tracking lost -> recovering這狀態瞬間時就會出現webrequest無回應的狀態,而且最重要的是:
這是Unity的一個Bug,
具體導致的原因牽扯到unity打開出xcode工程后里面UnityWebRequest.mm類的代碼邏輯,因為我對xcode的webrequest請求原理不太熟悉,感興趣的可以查看原帖里面其他開發者的討論,
下面來說下解決方案:
在生成的XCode工程中找到UnityWebRequest.mm類,對里面的UnityCreateWebRequestBackend函式增加一行代碼:
webOperationQueue = [[NSOperationQueue alloc] init];
webOperationQueue.name = @"com.unity3d.WebOperationQueue";
webOperationQueue.qualityOfService = NSQualityOfServiceUserInteractive;
同時對于使用Unity2018.4以下的版本的解決方案:
因為unity2018版還沒有UnityWebRequest,使用的還是WWW,找到輸出的Xcode工程中的WWWConnection.mm類,在第392行添加下面的代碼:
webOperationQueue.qualityOfService = NSQualityOfServiceUserInteractive;
總結:雖然是找到了解決方案,但畢竟這是Unity的bug而且還比較致命,每次發布都需要在對應的類里面進行修改,希望Unity能早日修復這個bug,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/257818.html
標籤:其他
上一篇:Android kotlin 自定義View 旋轉、移動、放縮 ImageView
下一篇:MarkDown學習
