Phonegap Build和WKWebView:我们在这里遇到的是沟通失败



WKWebview和Phonegap Build: index.js和WKWebview之间的通信是否可能?

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

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

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

我可能会很高兴与任何方法之间的通信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个煮熟的鸡蛋给任何能帮我解决这个问题的人。

InAppBrowser是一个善变的野兽,所以很高兴帮助!作为参考,我现在有一个应用程序,使用InAppBrowser和WKWebView,两者都使用以下工作:

"LoadStop" not firing:

  1. Self vs _blank:我通常通过"_blank"而不是"self"打开浏览器。试试。
  2. 新版本的InAppBrowser仍然应该自动别名为'window '。但是在文档中他们提到这个很快就会消失。你可以在deviceready事件中这样做:

    窗口。

或者,可能是更安全的选择,直接使用"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
            }
        });

另外,确保InAppBrowser的任何使用都是在'deviceready'事件触发之后。

执行脚本问题

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

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

我不完全确定,但根据MDN,你不应该传递一个参数到位置搜索功能了吗?

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

最后,请注意WKWebView目前确实有许多已知的问题。总是先检查GitHub或官方Apache Cordova网站上的已知问题,因为正如你写的那样,你可能会花很多时间一无所获。我目前正在使用WKWebView的这个分支——这个团队比"官方"插件修复bug的速度要快得多,所以你可以试试。

相关内容

最新更新