在我的可可应用程序中,我正在使用WKWebView
,并且一切正常,但是当我尝试进行音频或视频通话时,却没有发生,因为我没有摄像头和麦克风的权限。因此,我如何才能同时访问两者。我已经注入了JavaScript,有什么方法可以让我们默认使用脚本允许Microphone and camera
吗?
我已经尝试使用下面的代码允许(试图解决诺言),但仍然无法访问麦克风。由于此弹出窗口不会显示在WKWebView中,所以我如何获得许可。
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
});
有什么建议吗?
预先感谢!
答案 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);
}
})();
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 } } }
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];
}
希望这会有所帮助。