Cordova app (iOS) 中的 iframe history.back() 问题

iframe history.back() issues in Cordova app (iOS)

本文关键字:history back 问题 iframe 中的 iOS Cordova app      更新时间:2023-09-26

我正在使用Cordova开发Android和iOS的应用程序。

页面结构如下。
- 页 A (无 iframe)
- 页面 B (带内嵌框架)

转换
1. 页 A -->页 B (转发)
2. 页面 A <-- 页面 B(按历史向后返回())

iframe 显示外部网页。
当它从页面B(w/iframe)返回到页面A(w/o iframe)时,我必须调用hisotory.back()两次。
但是,由相同的javascript源构建的Android应用程序只需要调用history.back()一次。
此外,当使用iOS的本机WebVIew(UIWebView)时,不会发生类似的问题。

这是Cordova(iOS)规范还是错误?
有人遇到过这个问题吗?

版本
科尔多瓦 4.2 (iOS 平台 3.8.0)
iOS 8.3

谢谢。

首先,iOS 中的 iframe 会分享它们的历史。其次,iOS 中的 Cordova 使用 iframe 作为 JsToNativeBridge。

因此,在您的应用程序中,有两个 iframe。一个用于显示您的主页。另一个用于 JsToNativeBridge。(此 iframe 已隐藏)

history.back 的功能与这两个 iframe 相冲突。

一个解决方案如下。

在 deviceready 事件之后,在任何插件工作之前,执行该

var exec = cordova.require('cordova/exec');
exec.setJsToNativeBridgeMode(exec.jsToNativeModes.XHR_OPTIONAL_PAYLOAD);

备注 一些插件使用 addEventlistener 作为设备就绪事件。如果您使用这样的插件,请尝试下一个解决方案。

另一种解决方案是在iOS中修改cordova.js。

以前:

if (bridgeMode === undefined) {
    bridgeMode = jsToNativeModes.IFRAME_NAV;   
}

后:

if (bridgeMode === undefined) {
    bridgeMode = jsToNativeModes.XHR_NO_PAYLOAD;
    // bridgeMode = jsToNativeModes.IFRAME_NAV;
}

我遇到了同样的问题,对我有用的解决方案是一个简单的技巧。将 :

   <a data-rel="back" data-icon="back">back</a>
by
    <a data-id="persistent" href="the page_before" data-transition="slide" data-icon="back"> back</a>

它工作正常