Вот шаги, которые необходимо выполнить:
Сначала добавьте разрешения NSCameraUsageDescription и NSMicrophoneUsageDescription в Info.plist для вашего проекта
Теперь добавьте JS-файл (WebRTC.js), который определяет различные классы WebRTC, функции и передает вызовы в WKWebView.
Допустим, например:
(function() {
if (!window.navigator) window.navigator = {};
window.navigator.getUserMedia = function() {
webkit.messageHandlers.callbackHandler.postMessage(arguments);
}
})();
- В WKWebView внедрить скрипт в начале документа:
let contentController = WKUserContentController ();contentController.add (self, name: "callbackHandler")
let script = try!String (contentsOf: Bundle.main.url (forResource: "WebRTC", withExtension: "js") !, кодировка: String.Encoding.utf8) contentController.addUserScript (WKUserScript (source: script ,jectionTime: WKUserScriptInjectionTime.atDocumentStart forartMart for) дляtrue))
let config = WKWebViewConfiguration () config.userContentController = contentController
webView = WKWebView (фрейм: CGRect.zero, конфигурация: config)
Класс 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: ...}) ", creationHandler: nil)
Эти обратные вызовы должны храниться в хэше в JavaScript перед вызовом postMessage, тогда ключ хеша должен быть отправлен в WKWebView.Это идентификатор команды в плагинах.
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];
}
Надеюсь, это поможет.