Недавно я переносил свое приложение веб-просмотра из 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. Кто-нибудь получил такую же проблему? Я открыт для новых подходов.