WebViewRTCDataChannel
使用 WKWebView 构建的简单有效的 iOS RTCDataChannel。
而不是包含外部本地 WebRTC iOS 框架,该库利用 WebKit 内置的 WebRTC 功能,并通过 WKWebView 控件公开 WebRTC 功能。
示例
此项目包含的示例作为 '尽可能简单' 的 WebRTC-Example-DataChannel 项目的端点构建。
WebRTC-Example-DataChannel 项目包含一个信令服务器和可以在此服务器上运行并通信的示例客户端。
此项目中包含的示例作为其中一个客户端。按照 WebRTC-Example-DataChannel 项目中给出的说明启动服务器的副本并打开一个客户端,然后使用此项目包含的示例作为另一个客户端。
要运行示例项目,首先在 Example 目录中克隆存储库,然后运行 pod install
。
安装
WebViewRTCDataChannel 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:
pod 'WebViewRTCDataChannel'
iOS WebRTC 支持概要
(截至 2019 年 3 月的相关信息)
WebKit 宣布自 iOS 11 开始支持 WebRTC。
WKWebView 和 Safari 都是建立在 WebKit 之上,但它们的 WebRTC 支持有如下不同:
Safari
自 iOS 11 开始,Safari 应用浏览器完全支持 WebRTC。
但要注意的是,由于安全问题,Safari 默认不暴露 'Host' ICE 候选人。这意味着 WebRTC 很可能无法通过 STUN 建立连接 - 而需要 TURN 服务器。
可以采取以下方法解决这个问题
- 在 Safari 浏览器中的开发者设置中手动禁用 Ice Candidate 限制(您可以在桌面和移动设备上执行此操作)
- 调用 getUserMedia()!!! Safari 实现了他们的安全限制,'Host' ICE 候选人在您通过 getUserMedia() 接受 Camera/Microphone 权限之前是禁用的。因此,许多人做了类似以下的事情(并提示用户接受)
// (taken from WebRTC Samples GitHub)
if (adapter.browserDetails.browser === 'safari') {
try {
console.log('Call getUserMedia() to trigger media permission request.');
const stream = await navigator.mediaDevices.getUserMedia({'audio': true, 'video': true});
stream.getTracks().forEach(t=> t.stop());
} catch (e) {
console.error('Error requesting permission: ', e);
return;
}
}
WKWebView
WebRTC 有三个主要的 JavaScript 组件
- MediaStream(即 getUserMedia)
- RTCPeerConnection
- RTCDataChannel
幸运的是,WKWebView 支持 RTCPeerConnection 和 RTCDataChannel。并且这就是完成 RTCDataChannel 所需要的一切。
不幸的是,由于安全问题,WKWebView 目前还不能支持 MediaStream。截至 iOS 12,这仍然是真实的情况。如前所述的 Safari 部分,这对我们来说是个坏消息,因为这意味着我们无法发现 'Host' ICE 候选人。这使我们仍然需要 TURN(除非 srflx - 服务器反射候选人可在您的网络上工作)。
tldr; WebRTC 在 Safari 中完全支持,在 WKWebView 中部分支持(RTCDataChannel 通过 TURN 工作)
路线图
目前,该项目通过 WKWebView 提供了基本实现的 WebRTC DataChannel。虽然库的目标是尽可能地简单,但可以对其进行许多改进。其中一些包括
- 将示例更新为使用一个与WebRTC-Example-RTCDataChannel中包含的Web GUI相匹配的GUI。
- 添加方便的方法来启用/禁用日志记录。
授权
WebViewRTCDataChannel在MIT授权下可用。有关更多信息,请参阅LICENSE文件。