如何在WKWebView可可中获取相机和麦克风的访问权限?

时间:2018-11-28 06:37:51

标签: objective-c macos cocoa wkwebview microphone

在我的可可应用程序中,我正在使用WKWebView,并且一切正常,但是当我尝试进行音频或视频通话时,却没有发生,因为我没有摄像头和麦克风的权限。因此,我如何才能同时访问两者。我已经注入了JavaScript,有什么方法可以让我们默认使用脚本允许Microphone and camera吗?

我已经尝试使用下面的代码允许(试图解决诺言),但仍然无法访问麦克风。由于此弹出窗口不会显示在WKWebView中,所以我如何获得许可。

this

  async function wrapperFunc() {
    try {
        alert("resolved 1");
        let r1 = await someFunc();
        let r2 = await someFunc2(r1);
        // now process r2
        return someValue;     // this will be resolved value of the returned promise
    } catch(e) {
        throw e;      // let caller know the promise rejected with this reason
    }
}

wrapperFunc().then(result => {
                   // got final result
                   alert("resolved");
                   }).catch(err => {
                            // got error
                            });

this is what i am getting

有什么建议吗?

预先感谢!

1 个答案:

答案 0 :(得分:2)

这是您需要遵循的步骤:

  • 首先将NSCameraUsageDescription和NSMicrophoneUsageDescription权限添加到项目的Info.plist中。

  • 现在添加定义各种WebRTC类,函数并将JS调用传递到WKWebView的JS文件(WebRTC.js)。

让我们说一遍

(function() {
  if (!window.navigator) window.navigator = {};
  window.navigator.getUserMedia = function() {
    webkit.messageHandlers.callbackHandler.postMessage(arguments);
  }
})();
  • 在WKWebView中,在文档开始处插入脚本:
  

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

     

让脚本=尝试! String(contentsOf:Bundle.main.url(forResource:“ WebRTC”,withExtension:“ js”)!,编码:String.Encoding.utf8)   内容控制器.addUserScript(WKUserScript(源:脚本,injectionTime:WKUserScriptInjectionTime.atDocumentStart,forMainFrameOnly:true))

     

让config = WKWebViewConfiguration()   config.userContentController = contentController

     

webView = WKWebView(框架:CGRect.zero,配置:配置)

  • 现在添加此:
  

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
    }
} }
  • 如果需要在JavaScript领域中执行成功或失败回调,请直接在WKWebView中评估函数调用:
  

webView.evaluateJavaScript(“ callback({id:(id),status:'success',   args:...})“,completedHandler:无)

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

int exec_id = 0;
function exec(success, failure, ...) {
  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: ...})
}

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);
  }
  if (!opts.keepalive) delete exec_callbacks[opts.id];
}

希望这会有所帮助。