关于在IOS平台下使用ARFoundation+UnityWebRequest无响应的解决方法

最近发现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,附上帖子的链接:UnityWebRequests on iOS sometimes get stuck indefinitely even with timeout set - Unity Forum

原来是两个原因导致了这种情况:

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。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Unity AR FoundationUnity 的一个扩展包,用于开发增强现实(AR)应用程序。它提供了一系列的工具和功能,帮助开发者在 Unity 中轻松构建 AR 应用,并且支持多个平台,包括 iOS。 在 iOS使用 Unity AR Foundation,可以通过 Unity 的集成开发环境(IDE)来创建和管理 AR 项目。开发者可以通过 Unity 的图形界面编辑器来构建场景和添加 AR 特效,也可以使用 C# 脚本编写自定义的逻辑和行为。 Unity AR Foundation 提供了一些基本的功能,例如:追踪和识别平面、将虚拟物体投射到现实世界中,并且支持在运行时与现实世界进行交互。开发者可以使用 Unity 的强大的图形渲染引擎来创建逼真的虚拟物体,并且可以通过使用 Unity 的物理引擎来实现物体的物理行为。 AR Foundation 还提供了与 iOS 设备原生功能的集成,例如:相机、陀螺仪、加速度计等。通过与 iOS API 的结合,开发者可以创建更加综合和强大的 AR 应用程序。比如,可以利用相机捕捉的图像进行图像识别和跟踪,或者使用设备的陀螺仪和加速度计来实现更加精准的感知和交互。 总之,Unity AR Foundation 是一个用于开发 AR 应用程序的强大工具,通过它可以方便地在 Unity 中构建多平台AR 应用程序,包括在 iOS 设备上运行的应用。使用 Unity AR Foundation,开发者可以充分利用 Unity 强大的图形和物理引擎来创建逼真的虚拟体验,并且与设备的传感器和功能进行紧密的集成,从而实现真实世界与虚拟世界的融合。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值