在ipad(ios13以及ios14),运行工作流会出现以下报错:
ReferenceError: Can't find variable: AudioContext
报错问题在于AudioContext,导致运行未成功,一直卡在加载部分,结合问题是出在ios系统上,那么锁定问题原因是ios系统上严格的audio兼容限制。
梳理逻辑,工作流触发运行的方法在app/components/workflow-app/hooks/use-workflow-run.ts文件下的handleRun方法中。
在该方法中,梳理到和报错可能有关的代码
分析报错的原因:此处的player可能会初始化失败,并且handleRun中的ssePost用于与后端建立SSE连接,而player在ssePost中处理音频。
定位到ssePost方法
bug解决
在handleRun中
首先为了避免player初始化失败,修改代码为
这样修改后,如果AudioPlayerManager未正确初始化,则可以使得内容为空(不用audio)
在ssePost中
先检查是否是ios设备,在ios中,AudioContext可能有严格的使用限制。
那么如果AudioContext不存在,就建立一个假的AudioContext
作用是:使得所有后续代码都能正常使用AudioContext,避免一直卡在加载页面
在ssePost方法中加入:
构建后自测,问题已解决。
优化bug修复方案,采用全局方案,直接在入口文件web/app/layout中考虑AudioContext未被定义的情况。
这样修改有了新的报错
这个报错弹窗来自前台,经定位,源于/web/app/components/base/audio-btn/audio.ts
报错原因:入口文件只修复了 AudioContext,但 AudioPlayer 还需要 MediaSource 和 ManagedMediaSource。因此在入口文件增加对MediaSource和 ManagedMediaSource未定义时的处理情况。
如果浏览器不支持MediaSource,则创建一个假的MediaSource函数,由于在AudioPlayer中要创建MediaSource实例,若不存在就会有错误提示。
因此我们在入口文件保证MediaSource被定义为空,不影响运行的流程。
在ios17中会使用ManagedMediaSource,因此如果不存在,同样使用定义的MediaSource。