兼容性问题:ios13不支持AudioContext和MediaSource 的问题

139 阅读2分钟

在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。