WebRTC 无法在 iOS Safari 上的 Angular 5 中工作

2023-12-25

我正在使用 WebRTC 构建一个应用程序,但它无法在 iOS Safari 上的 Angular 5 中运行。我使用原生 WebRTC API,没有框架。

首先没有 Angular

为了证明我的观点 Angular 是问题所在,我使用纯 html 和 javascript 进行了 WebRTC 测试。所以我有一个index.html and a my-webrtc.js.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">    
  <title>WebRTC Test</title>
</head>
<body>
  <div>
    <video id="local-video" playsinline autoplay muted></video>
    <video id="remote-video" playsinline autoplay></video>
  </div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.4/socket.io.js"></script>  
  <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>
  <script src="js/my-webrtc.js"></script>
</body>
</html> 

我将这两个文件放在 TLS/SSL 安全 Web 服务器上。在同一台服务器上,我安装了一个基本的信令服务器。在里面my-webrtc.js一切应有尽有:发信号、提供、应答、ice 候选者以及将流连接到 HTML 元素。

对于所有测试,我仅使用 LAN 只是为了确保不需要 STUN 或 TURN。

检测结果

在这些经过测试的情况下一切正常:

  • 桌面/Chrome 桌面/Chrome
  • 桌面/Chrome 桌面/Firefox
  • 桌面/Chrome 桌面/Safari
  • 桌面/Chrome Android/Tab/Chrome
  • 桌面/Chrome iPhone/Safari
  • 桌面/Chrome iPad/Safari
  • 桌面/Safari iPhone/Safari
  • 桌面/Safari iPad/Safari
  • iPad/Safari iPhone/Safari

设备规格:

桌面/Chrome
- Macbook MacOS 10.12.6
- Chrome 64.0.3282.140

桌面/火狐
- Macbook MacOS 10.12.6
- 火狐58.0.1

桌面/Safari
- Macbook MacOS 10.12.6
- Safari 11.0.3

安卓/标签/Chrome
- 三星 Galaxy Tab3 8.0 英寸 (SM-T310)
- 安卓4.4.2
- Chrome 64.0.3282.137

iPad/Safari
- iPad 迷你 2 (A1489)
- iOS 11.2.5
- 苹果浏览器

iPhone/Safari
- iPhone 6 (A1586)
- iOS 11.2.5
- 苹果浏览器

之后我做了另一次测试离开adapter-latest.js出于index.html然后上述所有测试情况仍然可以正常工作。

现在我把所有东西都放在 Angular 中

现在我进行下一步。我使用 Angular CLI 版本 1.6.3 创建一个新的 Angular 测试应用程序:

ng new webrtc-angular-test

它会生成一个新的 Angular 5.2.3 应用程序。为了发出信号,我需要安装socket.io:

npm install --save [email protected] /cdn-cgi/l/email-protection

对于打字稿中的打字,我添加:

npm install --save @types/[email protected] /cdn-cgi/l/email-protection
npm install --save @types/[email protected] /cdn-cgi/l/email-protection

Then in app.component.html我把同样的index.html:

<video id="local-video" playsinline autoplay muted></video>
<video id="remote-video" playsinline autoplay></video>

And in app.component.ts我粘贴所有内容my-webrtc.js。我必须做一些小的修改,以便 javascript 在打字稿中工作。我还没有导入任何适配器。

然后构建它:

ng build

并复制内容dist到信令服务器也运行的同一个 TLS/SSL 安全 Web 服务器。

测试结果

它在这些情况下效果很好:

  • 桌面/Chrome 桌面/Chrome
  • 桌面/Chrome 桌面/Safari
  • 桌面/Chrome Android/Tab/Chrome
  • 桌面/Chrome 桌面/Firefox

在 iOS 上授予权限后,localStream 可见。当。。。的时候RTCPeerConnection建立后,remoteStream 在 iOS 上正常可见,几乎同时 localStream 冻结。控制台中没有错误消息。在桌面端一切正常。如果涉及两个 iOS 设备,则两侧的 localStream 都会冻结。这种情况发生在以下情况:

  • 桌面/Chrome iPhone/Safari
  • 桌面/Chrome iPad/Safari
  • 桌面/Safari iPhone/Safari
  • 桌面/Safari iPad/Safari
  • iPad/Safari iPhone/Safari

添加 Webrtc 适配器

然后我安装webrtc-adapter:

npm install --save [email protected] /cdn-cgi/l/email-protection

In app.component.ts我放了一个import 'webrtc-adapter';

但事情变得更糟!

测试结果

它在这些情况下效果很好:

  • 桌面/Chrome 桌面/Chrome
  • 桌面/Chrome 桌面/Safari
  • 桌面/Chrome Android/Tab/Chrome
  • 桌面/Chrome 桌面/Firefox

在 iOS 上授予权限后,localStream 可见。当。。。的时候RTCPeerConnection建立后,remoteStream 在 iOS 上正常可见,几乎同时 localStream 冻结。控制台中没有错误消息。在桌面端一切正常。如果涉及两个 iOS 设备,则两侧的 localStream 都会冻结。这种情况发生在以下情况:

  • 桌面/Chrome iPhone/Safari
  • 桌面/Chrome iPad/Safari

LocalStream 两边都可见,但remoteStream 两边都不可见。日志记录显示peerConnection 已创建。发送/接收报价并发送/接收答复。 RemoteStream 已添加但不可见。没有发送 Ice 候选人。 RTC 对等连接状态更改为“正在检查”。没有错误消息。以下情况也会发生同样的情况:

  • 桌面/Safari iPhone/Safari
  • 桌面/Safari iPad/Safari
  • iPad/Safari iPhone/Safari

我的结论:

我有一个工作的 WebRTC 环境,只是带有 javascript 的纯 html。然后我用 typescript 将其放入 Angular 5 中,但它在 iOS Safari 上不再工作。这肯定是 Angular 5、typescript 或 zone.js 之类的依赖项的问题。

我的问题:

您同意我的结论还是我忽略了某些事情?
谁知道问题是什么并知道解决方案?

非常感谢帮助!


添加后出现的问题webrtc-adapter是由zone.js并通过添加以下行来解决polyfills.ts(如果使用angular-cli)

// rtc peer connection patch
import 'zone.js/dist/webapis-rtc-peer-connection';
// getUserMedia patch
import 'zone.js/dist/zone-patch-user-media';

你应该在之后添加这个import 'zone.js/dist/zone';该文件已包含在该文件中。

我放弃了一个问题GitHub https://github.com/angular/angular/issues/22697解决 iOS 上 localStream 冻结的主要问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebRTC 无法在 iOS Safari 上的 Angular 5 中工作 的相关文章

随机推荐

  • ModuleNotFoundError:没有名为“google.appengine”的模块

    我想在 Windows 上用 python3 进行谷歌搜索 谷歌说明说他们支持 python3 并输入 gcloud topic init 以获取详细信息 但没有说没有 python2 7 的解释器 我是否必须安装 python2 7 才能
  • 如何在 Android O 中设置 Firebase 通知 ChannelID?

    对于 API 级别 26 我们必须设置一个通道 id 作为参考 我学会了如何在没有 ChannelID 的情况下做到这一点 下面是我的 Firebase 消息传递设置代码 但现在对于新的 Android api 26 级别 Notifica
  • f:convertDateTime 支持 Java8 LocalDate / LocalDateTime? [复制]

    这个问题在这里已经有答案了 JSF 核心标签f 转换日期时间 https docs oracle com javaee 7 javaserver faces 2 2 vdldocs facelets f convertDateTime ht
  • 判断一个数字是否是 scala 中的好数字

    您好 我是 Scala 函数式编程方法的新手 我想在我的函数中输入一个数字并检查它是否是一个好数字 如果一个数字的每个数字都大于该数字右侧的数字之和 则该数字是一个好数字 例如 9620 相当于 2 gt 0 6 gt 2 0 9 gt 6
  • 如何有效去除字符串的一部分

    有一个像 A B C D E F 这样的字符串 如何删除 C D 部分并得到像 A B E F 这样的字符串 要么只是将其替换掉 input Replace C D 或者使用上一个问题的解决方案之一 将其从数据结构中删除并将其重新连接在一起
  • 从 Struts2 应用程序中的 FreeMarker 获取模板文本

    我想使用 Freemarker 在 Struts2 应用程序中生成电子邮件 由于我也在使用 Freemarker 来实现我的观点 因此我想 重用 相同的配置 使用 Spring 做同样的事情已经有一个类似的问题 在 Spring 应用程序中
  • Java 包装器到 Perl/Python 代码

    我必须在仅支持 Java 的服务器上部署一些 Web 服务 但其中一些将使用 perl 或 python 完成 我想知道是否可以开发一个 Java 包装器来调用用 perl 或 python 编写的特定代码 因此 我希望所有的 Web 服务
  • 如何减少 GC 期间弱引用的处理时间?

    目前 我面临的问题是我的应用程序偶尔会显示较长的 GC 时间 但所有这些都只是由弱引用处理引起的 所以线程停止时间总是接近弱引用处理时间 所有其他 GC 周期均为 0 0001 秒至 0 200 秒 来自 gc log 重新格式化 1038
  • 如何从初始 LocalDateTime 和 cron 表达式获取下一个 LocalDateTime?

    我有一个初始日期和一个 cron 表达式 我怎样才能找到满足这个 cron 表达式的下一个日期 String cronExpresion LocalDateTime initial LocalDateTime now LocalDateTi
  • React 中的可搜索下拉菜单

    我有以下反应列表
  • 应用程序首次打开时的条件页面显示

    您好 我刚刚开始学习 Angular Angular UI Router 并试图找出如何确定应用程序首次打开的时间 以将用户发送到登录页面或主页 这是我到目前为止所拥有的 codeArtApp config function statePr
  • 无法使用带有 x-www-form-urlencoded 参数的 JSOUP 登录网站

    我如何使用来实现以下请求Jsoup http jsoup org POST 登录 用户 HTTP 1 1主机 url publishedprices co il缓存控制 无缓存 内容类型 application x www form url
  • 关于 C# 字符串的问题:不变性和克隆

    我正在阅读 Accelerated C 2010 并且有几个问题 问题1 String 的实例是不可变的 一旦你创造了它们 你无法改变它们 这是真的吗 我已经有一段时间没有使用 C 了 而且我才刚刚开始 所以我什至在语法上也可能是错误的 s
  • Git 子模块 — 排除特定文件/目录

    我正在尝试使用 Git 的 子模块 功能在项目中包含第 3 方代码 我只需要子模块中的几个文件 并希望排除它附带的所有文档等 我怎样才能做到这一点 在我的子模块中我有一个 examples我想删除的文件夹locally防止自动生成的 mak
  • Polymer 1.0:如何将参数从属性传递给 Polymer 函数?

    有没有办法将参数从 Polymer 函数内部的元素属性传递给 Polymer 函数
  • 如何使用nodejs动态创建Mongodb模式

    我想知道是否可以使用 Mongoose 模式 Node js 和 Angular 在 mongodb 中动态创建表 创建模式的基本方法是在 Node js 中显式创建模型 如下所示 import mongoose from mongoose
  • 在TFS中使用Tortoise SVN diff

    我想将 Tortoise SVN diff 实用程序与 TFS 一起使用 我知道如何在 TFS 中配置用户工具 我需要的是 Tortoise SVN diff 实用程序的安装程序 我想我需要安装完整的 Tortoise SVN 才能获取 S
  • 将数据源动态绑定到应用程序制造商弹出窗口

    我需要有一个通用的 删除确认 弹出窗口 并使用弹出窗口出现之前触发的事件将数据源动态绑定到弹出窗口 单击 位置 页面上的删除图标时 将出现弹出窗口 截图如下 我需要同时设置弹出窗口的数据源 当用户单击此删除图标时 并且当用户单击弹出窗口上的
  • Rcmd 检查:“:::”调用导入的未导出对象

    这个问题与Rcmd check在 R Devel 3 1 0 中 我正在维护一个包 称之为 A 它 依赖于 另一个包 让我称之为第二个包 B 出于以下原因 我使用 依赖 而不是 导入 大多数使用 A 包的人也使用 B 包 包 A 广泛使用包
  • WebRTC 无法在 iOS Safari 上的 Angular 5 中工作

    我正在使用 WebRTC 构建一个应用程序 但它无法在 iOS Safari 上的 Angular 5 中运行 我使用原生 WebRTC API 没有框架 首先没有 Angular 为了证明我的观点 Angular 是问题所在 我使用纯 h