【问题标题】:Phonegap Build and WKWebView: What we have here is a failure to communicatePhonegap Build 和 WKWebView:我们这里有一个通信失败
【发布时间】:2016-09-20 18:21:21
【问题描述】:

WKWebview 和 Phonegap 构建:index.js 和 WKWebView 之间的通信甚至可能吗?

我正在使用 Phonegap Build 来生成我的移动设备可执行文件。我正在打开一个 webview 并从我们的网站加载一个页面。在使用 UIWebView 时,我在移动设备上对 index.js 进行编码以侦听 loadstop 事件并调用 executescript 以在 webview 中的网页上执行 javascript 并将结果返回给 index.js,我可以在其中做任何我需要的事情。

但是 UIWebView 很慢,所以对于 iOS,我一直在尝试让 WKWebView 通过 cordova-plugin-wkwebview-engine 插件工作。

我可以让 WKWebview 打开我的 URL,与 UIWebView 相比,它的速度非常快,但是经过几天的搜索(每个页面都包含 Google 知道的“WKWebView”和“Phonegap”)和实验,我一直无法找到任何方法来检测 loadstop(或等效),我也没有找到任何方法来从 index.js 中执行 WKWebView 中的脚本。

我可能会对 index.js 和 WKWebView 之间的任何通信方法感到满意。 loadstop事件后是否有类似executescript的过程,即使是异步的?是否有某种类型的消息传递功能?

我很想看看 index.js 的一些代码示例。

我开始认为我将不得不崩溃并求助于在 xcode 中学习本机代码来实现这一点。我当然希望不是因为到目前为止,Phonegap Build 对我来说效果很好。

有人遇到过这种情况吗?

这是在 UIWebView 下工作的代码。在 WKWebView 下可以很好的打开 URL,但是 loadstop 没有触发,也没有执行脚本。


launchBrowserWindow: function (url) { 
    var ref;
    try {
        ref = window.open(url, '_self', 'location=no,toolbar=no');                
    } catch (e) {
        console.log("McMApp catch window.open fail: " + url + " err: " + e.message);
    }
    try {
        ref.addEventListener("loadstop", function () {
            ref.executeScript(
                { code: 'window.location.search' },
                function (value) {
                    var requestString = value[0];
                    console.log("McMApp loadstop request string: " + requestString);
                });

        });
    } catch (e) {
        console.log("McMApp FAIL ref.addeventlistener loadstop");
    }
},

50 个煮熟的鸡蛋送给任何可以帮助我完成这项工作的人。

【问题讨论】:

    标签: ios cordova phonegap-build wkwebview


    【解决方案1】:

    InAppBrowser 是一只善变的野兽,很乐意为您提供帮助!作为参考,我现在有一个使用 InAppBrowser 和 WKWebView 的应用程序,并且两者都使用以下内容:

    “LoadStop”未触发:

    1. 自我与_空白: 我通常通过“_blank”而不是“self”打开浏览器。试试看。
    2. 较新版本的 InAppBrowser 仍应自动别名为 'window.open' 但 in the docs they mention this will go away soon。你可以在 deviceready 事件中这样做:

      window.open = cordova.InAppBrowser.open;

    或者,可能是更安全的选择,只使用“cordova.InAppBrowser.open”。

    这是我使用的代码。尝试打印或“警告”正在通过的 URL。它们可能不是您所期望的,尤其是在有多个重定向的情况下。

    var inAppBrowserRef = cordova.InAppBrowser.open("www.google.com", '_blank', 'location=no,toolbar=yes');
            inAppBrowserRef.addEventListener('loadstop', function(event) {
                console.log("loadstop: " + event.url);
                alert("loadstop: " + event.url);
    
                // run execute script code
                }
            });
    

    此外,请确保在“deviceready”事件触发之内/之后使用 InAppBrowser。

    执行脚本问题

    我相信这里的问题是您的代码没有触发。 See here,将其包装成一个函数并立即调用:

    ref.executeScript(
                    { code: 'var runCode = function() { window.location.search; } runCode();' },
                    function (value) {
                        var requestString = value[0];
                        console.log("McMApp loadstop request string: " + requestString);
                    });
    

    我不完全确定,但according to MDN, 你不应该也将参数传递给位置搜索功能吗?

    // Append "someData" as url parameter query
    window.location.search = "someData";
    

    最后,请注意 WKWebView 目前确实存在许多已知问题。始终首先检查 GitHub 或官方 Apache Cordova 站点等上的已知问题,因为正如您所写的那样,您可能会浪费很多时间而无处可去。我目前正在使用this fork of the WKWebView - 这个团队比“官方”插件修复错误的速度要快得多,所以你可以尝试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2013-10-29
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多