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

Build.Phonegap Facebook SDK

PhoneGap Build 和 CLI 的相对图标路径

phonegap build在phonegap app开发中的作用是啥

Phonegap build 本地发布版本(不含Phonegap Build)

如何使用 Phonegap 命令行工具为 iOS 发布 Build?