移动 Safari:frame.src 与 window.location

Posted

技术标签:

【中文标题】移动 Safari:frame.src 与 window.location【英文标题】:Mobile safari : frame.src vs window.location 【发布时间】:2012-06-26 14:01:34 【问题描述】:

嗨,快速提问。

从 webview 调用 native 的最佳方式是什么? iframe 还是 window.location

例如:

gapBridge = document.createElement("iframe");
gapBridge.setAttribute("style", "display:none;");
gapBridge.setAttribute("height","0px");
gapBridge.setAttribute("width","0px");
gapBridge.setAttribute("frameborder","0");
document.documentElement.appendChild(gapBridge);
gapBridge.src = custom + "://" + custom;

或:

window.location = custom + "://" + custom;

Ps:顺便说一句,在嵌入的 webview 中更改 src 似乎不起作用。正如堆栈上的其他文章所揭示的那样here

【问题讨论】:

【参考方案1】:

在我的情况下,iframe 似乎更好。我看到window.location 的问题是,如果您按顺序进行了多次调用,浏览器将忽略其中一些。在使用 iframe 时,您实际上可以为每个调用创建多个 iframe。我也在延迟后删除了 iframe,因此我发现自己没有大量的空 iframe DOM。

这是我使用的函数:

function _callNative(url)
    var _frame = document.createElement('iframe');
    _frame.width=0; _frame.height=0;_frame.frameBorder=0;
    document.body.appendChild(_frame);
    if (url.indexOf('?') >= 0)
        url = url + "&cb=";
    else
        url = url + "?cb=";
    
    _frame.src = url + Math.round(Math.random()*1e16);
    // Remove the iframe
    setTimeout(function()document.body.removeChild(_frame);, 2000);

例如:

_callNative('native://doSomethingNative()');
_callNative('native://doSomethingElse')

【讨论】:

嘿,感谢您的回复 :) 当我说 iframe 时,我指的是这个 iframe 的单个实例。我看你用过很多。你有任何关于为什么这更好的信息吗?您还说“我看到 window.location 的问题是,如果您按顺序进行多次调用,浏览器将忽略一些。”您有链接吗? :) 谢谢! 这都是我自己的经验,抱歉我没有链接。最好的办法是自己尝试,尝试使用一个 iframe、window.location 和多个 iframe。所有方法都应该可以正常工作,但是我需要按顺序执行几个调用,而它只是注册一个。具有多个 iframe 的方法是唯一对我有用的方法。你应该自己试试看。 如果我没有看到它,我不相信它。该测试平台使用各种方法(包括 window.locaion)github.com/mihaip/web-experiments/tree/master/… 来回执行 8000 次成功调用。想看看这方面的证据。真的不喜欢过度设计。 这篇文章已经超过 3 年了。我认为该方法并不复杂,我不会将其称为工程。这些年来我没有做太多的 ios 开发,所以我不能说我在 3 年前看到的限制是否仍然存在。我自己喜欢在安全方面犯错。我发现在 iframe 上打开这些 URL 也更优雅。但是做你自己的研究我不是在这里向你证明什么,做你认为最好的事情。 对不起,如果我出来有点困难。顺便说一句,你是对的。这个家伙blog.persistent.info/2013/10/… 可以确认在事件循环的同一旋转中重复设置 location.href 只会导致最终导航发生。使用 iframe 是规避此问题的一种方法。【参考方案2】:

以下是考虑了性能的不同替代方案的概要: http://blog.persistent.info/2013/10/a-faster-uiwebview-communication.html http://blog.persistent.info/2015/08/wkwebview-communication-latency.html

基本上,如果您支持 iOS 8 或更低版本,那么您最好使用location.replace

如果您支持 iOS 9 及更高版本并且差异很小,您可以选择您喜欢location.replaceWKScriptMessageHandler

【讨论】:

以上是关于移动 Safari:frame.src 与 window.location的主要内容,如果未能解决你的问题,请参考以下文章

移动 chrome 与 Safari 性能

移动设备上的 Safari - 计算样式与给定不同

您如何在移动 safari 上检测 3G 与 Wifi 连接?

当页面加载时,如何使 UIWebView 看起来与移动 safari 完全一样? (不是超级放大)

关于iframe与frame的学习

如何使用移动 Safari 下载数据客户端?