Phonegap Build 和 WKWebView:我们这里有一个通信失败
Posted
技术标签:
【中文标题】Phonegap Build 和 WKWebView:我们这里有一个通信失败【英文标题】:Phonegap Build and WKWebView: What we have here is a failure to communicate 【发布时间】: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 个煮熟的鸡蛋送给任何可以帮助我完成这项工作的人。
【问题讨论】:
【参考方案1】:InAppBrowser 是一只善变的野兽,很乐意为您提供帮助!作为参考,我现在有一个使用 InAppBrowser 和 WKWebView 的应用程序,并且两者都使用以下内容:
“LoadStop”未触发:
-
自我与_空白:
我通常通过“_blank”而不是“self”打开浏览器。试试看。
较新版本的 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 - 这个团队比“官方”插件修复错误的速度要快得多,所以你可以尝试一下。
【讨论】:
以上是关于Phonegap Build 和 WKWebView:我们这里有一个通信失败的主要内容,如果未能解决你的问题,请参考以下文章
Adobe PhoneGap Build (iOS) 和 PushWoosh
phonegap build在phonegap app开发中的作用是啥