Перенос интерфейса Javascript из UIWebView в WKWebView - PullRequest
0 голосов
/ 15 июня 2019

Недавно я переносил свое приложение веб-просмотра из UIWebView в WKWebView. Все шло хорошо, пока я не перенес класс, который я опубликовал методы из swift для вызова в веб-просмотре, с помощью javascript. На Android это очень просто, я просто использовал обозначение @JavascriptInterface в своих методах и добавил его в свое веб-представление. Но реализация на iOS была более сложной, поэтому я посмотрел этот проект в GitHub 1 .

По сути, он расширяет UIWebView и реализует метод для создания моего интерфейса JavaScript:

extension UIWebView {
    func addJavascriptInterface<T : JSExport>(_ object: T, forKey key: String){
    __globalWebViews.append(self)
    __globalKeyBinding = key
    __globalExportObject = object
  }
}

extension NSObject{
  func webView(_ webView: UIWebView!, didCreateJavaScriptContext context: JSContext!, forFrame frame: AnyObject!){
    let notifyDidCreateJavaScriptContext = {() -> Void in
        for webView in __globalWebViews
        {
            let checksum = "__KKKWebView\(webView.hash)"
            webView.stringByEvaluatingJavaScript(from: "var \(checksum) = '\(checksum)'")
            if context.objectForKeyedSubscript(checksum).toString() == checksum
            {
                context.setObject(__globalExportObject, forKeyedSubscript: __globalKeyBinding as (NSCopying & NSObjectProtocol)!)
            }
        }
     }

     if (Thread.isMainThread)
     {
         notifyDidCreateJavaScriptContext()
     }
     else
     {
         DispatchQueue.main.async(execute: notifyDidCreateJavaScriptContext)
     }
  }
}

var __globalWebViews : [UIWebView] = []
var __globalExportObject : AnyObject? = nil
var __globalKeyBinding : String = "Native" 

Эта реализация работала правильно для моего UIWebView, но теперь у меня возникают трудности при переносе его в WKWebView. Кто-нибудь получил такую ​​же проблему? Я открыт для новых подходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...