在 WKWebView 中的本地网站上调用 javascript Actions

Posted

技术标签:

【中文标题】在 WKWebView 中的本地网站上调用 javascript Actions【英文标题】:Call javascript Actions on a local website in a WKWebView 【发布时间】:2017-10-10 09:14:03 【问题描述】:

我正在使用 Xcode 9.0 和 ios 11。当用户点击链接时,我正在尝试执行 javascript 代码。 js 代码嵌入在 WKWebView 内的本地 html 网站中。 我尝试了许多建议,例如使用 webView.evaluateJavaScript("document.getElementsByClassName('panel-title').innerText") 或为 webview 设置不同的配置。 html 站点包含一个 PrivacyPolicy,用户可以在其中展开和折叠不同的部分

看起来像这样:

<main class="container">
      <div>
      <h1 id="datenschutzwbrerklrung">Datenschutz<wbr>erklärung</h1>
          <p>Allgemein</p></div>
          <div class="panel panel-default"><div class="panel-heading" role="tab" id="headingsection1" data-toggle="collapse" data-parent="#accordion" href="#section1">
              <h4 class="panel-title">Allgemeiner Hinweis</h4></div><div id="section1" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingsection1"><div class="panel-body">
              <p>Es ist uns ein ganz besonderes Anliegen, dass sich alle Nutzer unserer App wohl und sicher fühlen. Aus diesem Grund ist uns der Schutz Ihrer personenbezogenen Daten von höchster Wichtigkeit.
                  Bei der Erhebung, Verarbeitung und Nutzung halten wir uns selbstverständlich streng an die gesetzlichen Bestimmungen des Bundesdatenschutzgesetzes (BDSG) und des Telemediengesetzes (TMG).
                  Wir verarbeiten personenbezogene Daten zur Auftragsabwicklung. Bei berechtigtem Interesse rufen wir zum Zweck der eigenen Kreditprüfung ggf. Bonitätsinformationen von Auskunfteien ab.</p></div></div></div>

          <br />

所以当用户点击“Allgemeiner Hinweis”时。下面的文字展开。这适用于 Mac 上的 Safari(必须激活 JavaScript)。但它在我的 WKWebView 中不起作用。 我当前的 WKWebView 配置如下所示:

var webView: WKWebView!

    override func loadView() 
        super.loadView()

        let contentController = WKUserContentController()
        let config = WKWebViewConfiguration()

        config.preferences.javaScriptEnabled = true
        config.preferences.javaScriptCanOpenWindowsAutomatically = true
        config.selectionGranularity = .character
        config.userContentController = contentController

        webView = WKWebView()
        webView.navigationDelegate = self

        self.webView.customUserAgent = "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136"
        view = webView

    

我也使用下面的委托方法。第一个 if 条件始终为假。对于第二个 if 语句错误,结果为 nil。

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 
        print("delegate")

        webView.evaluateJavaScript("document.getElementsByClassName('panel-title').innerText")  (result, error) in
            if error != nil 
                print(result ?? "nix")
            
            else 
                print("Error: \(String(describing: error))")
            
        
        webView.evaluateJavaScript("document.getElementsByClassName('panel-title')")  (result, error) in
        if error != nil 
            print("The result is: \(result ?? "nil")")
            print("resut error: \(error!)")
            
        else 
            print("The Error: \(String(describing: error))")
            

        

我确定仍然缺少一些东西。 非常感谢任何帮助。

【问题讨论】:

我无法发布整个 javascript 部分,因为它有超过 3000 行代码。似乎还涉及一些查询。也许有人可以给我一些一般提示如何使这项工作 【参考方案1】:

尝试将自定义用户代理属性设置为 WKWebView。

目标 C

[self.webView setCustomUserAgent:@"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136"];

斯威夫特

self.webView.customUserAgent = "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136"

希望这会有所帮助。

【讨论】:

感谢您的回答,但这并没有解决我的问题。现在我将以下行添加到我的代码中。 config.preferences.javaScriptEnabled = true 但这也没有效果。我不知道为什么 您能否编辑问题以显示您如何定义 WKWebView。 我编辑了 WKWebView 的声明和定义(中间代码部分) 现在我得到了一个错误值。它是德语,但您可以查看错误名称和错误代码:Error Domain=WKErrorDomain Code=5 "JavaScript-Ausführung hat ein Ergebnis in Form eines nicht unterstützten Typs ausgegeben" UserInfo=NSLocalizedDescription=JavaScript-Ausführung hat ein Ergebnis in Form eines nicht unterstützten Typs ausgegeben 它说:结果的类型不受支持 我将 html 文件上传到 google-drive:这是链接:drive.google.com/open?id=0B2WLxhNr7Zr4MEZKTG9KakRrT1E

以上是关于在 WKWebView 中的本地网站上调用 javascript Actions的主要内容,如果未能解决你的问题,请参考以下文章

使用 JavaScript 访问 WKWebView 中的本地文件

IOS - 来自本地HTML文件的WKWebView中的CORS

WKWebview 导航响应方法在单击 webview 中的完成按钮时不会被调用

添加 WKWebView 后 IONIC 中的 CORS API 调用问题

嵌入在 html 中的 javascript 未在 wkwebview 中运行

WKWebView 可以调用主应用程序中的函数并返回值吗?