jQueryMobile + PhoneGap + iOS 11:阻止尝试使用history.replaceState()更改会话历史记录URL

时间:2018-09-08 15:01:38

标签: jquery-mobile phonegap

从iPhone OS 11.3开始,我的应用程序损坏,出现以下错误:

SecurityError: Blocked attempt to use history.replaceState() to change session history URL from file:///var/containers/Bundle/Application/E73A3E4A-D961-4943-BAA3-7845E755F6A0/myplaceonline.app/www/index.html#/?phonegap=true to https://myplaceonline.com/?phonegap=true. Protocols, domains, ports, usernames, and passwords must match.
url:
file:///var/containers/Bundle/Application/E73A3E4A-D961-4943-BAA3-7845E755F6A0/myplaceonline.app/www/js/jquery.mobile-1.4.5.min.js
line #: 3 (31672)

我一直做到的方式(这在Android上仍然可以使用):

  1. PhoneGap app将JQM加载到index.html page中。
  2. 附加了一个JQM mobileinit事件处理程序,该事件处理程序注册了一个pageloaded事件处理程序,该事件处理程序最终调用了loadHomepage
  3. loadHomepage将$.mobile.path.documentBase标签的hrefbase标签的$.mobile.pageContainer.pagecontainer("change", "/", { allowSamePageTransition: true, transition: 'none', reloadPage: true, changeHash: true });属性设置为我的远程服务器(https://myplaceonline.com/),并调用 replaceState@[native code] squash@file:///var/containers/Bundle/Application/E73A3E4A-D961-4943-BAA3-7845E755F6A0/myplaceonline.app/www/js/jquery.mobile-1.4.5.min.js:3:31672 go@file:///var/containers/Bundle/Application/E73A3E4A-D961-4943-BAA3-7845E755F6A0/myplaceonline.app/www/js/jquery.mobile-1.4.5.min.js:4:322 navigate@file:///var/containers/Bundle/Application/E73A3E4A-D961-4943-BAA3-7845E755F6A0/myplaceonline.app/www/js/jquery.mobile-1.4.5.min.js:4:1598 来加载远程主页。
  4. 这最终会驱动JQM调用replaceState,但失败并显示安全错误: file:///

以上所有内容的目的是使我不会离开byte[],因为如果这样做,我将无法通过PhoneGap访问所有本机电话JS API。这适用于旧版iOS,并继续适用于Android。

是否有其他方法可以解决此问题,从而在较新版本的iOS上解决更严格的安全性?另外,我看到类似https://github.com/jquery/jquery-mobile/issues/5465的问题提示了一种禁用历史记录的方法,我想知道这是否是另一个解决方法,我会失去什么?

1 个答案:

答案 0 :(得分:1)

将以下代码添加到mobileinit处理程序中可解决此问题:

$.mobile.hashListeningEnabled = false;
$.mobile.pushStateEnabled = false;
$.mobile.changePage.defaults.changeHash = false;