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:
- Self vs _blank:我通常通过"_blank"而不是"self"打开浏览器。试试。
-
新版本的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的速度要快得多,所以你可以试试。