Как получить доступ к камере и микрофону в WKWebView какао? - PullRequest
0 голосов
/ 28 ноября 2018

В моем приложении какао я использую 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 голосов
/ 28 ноября 2018

Вот шаги, которые необходимо выполнить:

  • Сначала добавьте разрешения 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];
}

Надеюсь, это поможет.

...