在wkwebview中启用摄像头和麦克风访问

SB2055

我有一个针对移动设备进行了优化的Web应用程序,可用于getUserMedia访问网络摄像头和麦克风资源。

WKWebView打算将此应用包装为A,因为我想提供本机应用体验。我知道,iOS不允许通过浏览器访问摄像机-但有什么办法来获得权限的网络摄像头/麦克风与本机代码(沿着封装)和饲料这对Web应用程序-也许在某种程度上指向getUserMedia一个本地流源?

企鹅仔

是的,看看cordova-plugin-iosrtccordova-plugin-wkwebview-engine插件背后的想法如下:

1.创建一个定义各种WebRTC类和函数的JavaScript文件(WebRTC.js),并将调用传递给WKWebView,例如:

(function() {
  if (!window.navigator) window.navigator = {};
  window.navigator.getUserMedia = function() {
    webkit.messageHandlers.callbackHandler.postMessage(arguments);
  }
})();

2.在WKWebView中,在文档开始处插入脚本:

let contentController = WKUserContentController();
contentController.add(self, name: "callbackHandler")

let script = try! String(contentsOf: Bundle.main.url(forResource: "WebRTC", withExtension: "js")!, encoding: String.Encoding.utf8)
contentController.addUserScript(WKUserScript(source: script, injectionTime: WKUserScriptInjectionTime.atDocumentStart, forMainFrameOnly: true))

let config = WKWebViewConfiguration()
config.userContentController = contentController

webView = WKWebView(frame: CGRect.zero, configuration: config)

3.收听从JavaScript发送的消息:

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, WKScriptMessageHandler {
  var webView: WKWebView!

  func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "callbackHandler" {
      print(message.body)
      // make native calls to the WebRTC framework here
    }
  }
}

4.如果需要在JavaScript领域中执行成功或失败回调,请直接在WKWebView中评估函数调用:

webView.evaluateJavaScript("callback({id: \(id), status: 'success', args: ...})", completionHandler: nil)

这些回调需要调用之前存储在JavaScript中的哈希中postMessage,然后必须将哈希键发送到WKWebView。这是commandId插件中的。

int exec_id = 0;
function exec(success, failure, ...) {
  // store the callbacks for later
  if (typeof success == 'function' || typeof failure == 'function') {
    exec_id++;
    exec_callbacks[exec_id] = { success: success, failure: failure };
    var commandId = exec_id;
  }
  webkit.messageHandlers.callbackHandler.postMessage({id: commandId, args: ...})
}

// the native code calls this directly with the same commandId, so the callbacks can be performed and released
function callback(opts) {
  if (opts.status == "success") {
    if (typeof exec_callbacks[opts.id].success == 'function') exec_callbacks[opts.id].success(opts.args);
  } else {
    if (typeof exec_callbacks[opts.id].failure == 'function') exec_callbacks[opts.id].failure(opts.args);
  }
  // some WebRTC functions invoke the callbacks multiple times
  // the native Cordova plugin uses setKeepCallbackAs(true)
  if (!opts.keepalive) delete exec_callbacks[opts.id];
}

5.当然为您的项目添加NSCameraUsageDescriptionNSMicrophoneUsageDescription权限Info.plist

请记住,这是一项艰巨的任务,但这是将JavaScript,WKWebView和本机框架代码与异步回调桥接在一起的基本思路。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android:WebView-未启用会议摄像头和麦克风

Firefox无需提示即可完全启用网络摄像头和麦克风

WebRTC在通话中更换麦克风或摄像头

如何允许环聊在Ubuntu BQ M10 OTA 11中访问摄像头和麦克风?

qt webengine 在 mac 上请求摄像头和麦克风访问

在Android 11中在后台访问麦克风/摄像头

从移动设备访问时,在本地主机上运行的应用程序无法启用摄像头麦克风

我们如何使用HTML页面访问移动设备的摄像头和麦克风

HDMI /监控麦克风的摄像头

应用程序未显示在MacBook的摄像头和麦克风隐私设置中

Pubnub javascript视频聊天摄像头和麦克风静音机制?

在 Virt-Manager 中使用网络摄像头和麦克风

好的麦克风/网络摄像头需要寻找的技术规格和功能

启用扬声器、麦克风和摄像头

如何将自定义端口条目列入白名单,以便Chrome提供启用摄像头和麦克风的选项

为什么有2个不同的Flash权限对话框可用于摄像头/麦克风访问

升级后,我的网络摄像头麦克风仅在Skype中录制快速,高音和吱吱作响(也许也是录音机问题)

Citrix Workspace 应用程序 2009 网络摄像头和麦克风在 Ubuntu 20.04 上不起作用

罗技网络摄像头麦克风/组合不起作用,只有网络摄像头没有麦克风

如何在 Windows 中隐藏显示器右上角的麦克风摄像头开/关覆盖

如何允许或拒绝通知地理位置麦克风摄像头弹出

捕获摄像头+麦克风并在macOS上编码为h264 / aac

Ubuntu 12.10 Skype网络摄像头麦克风无法正常工作

我的音频输入如何始终是网络摄像头麦克风?

USB 实时摄像头麦克风无法录制音频

如何从屏幕顶部删除Firefox橙色麦克风/网络摄像头指示器?

这是图书馆进口问题吗?抱歉,Google Play商店,但我的应用没有故意访问麦克风或摄像头

在没有摄像头和麦克风的情况下使用RTMP和Red5模拟视频聊天

使用FFMPEG记录来自两个麦克风的音频和来自一个网络摄像头和多路复用器的视频