jQueryMobile + PhoneGap + iOS 11: заблокированная попытка использовать history.replaceState () для изменения URL-адреса истории сеанса - PullRequest
0 голосов
/ 08 сентября 2018

Начиная с 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 загружает JQM на страницу index.html .
  2. Прикреплен обработчик событий JQM mobileinit, который регистрирует обработчик событий pageloaded, который в конечном итоге вызывает loadHomepage .
  3. loadHomepage устанавливает $.mobile.path.documentBase и атрибут href тега base для моего удаленного сервера (https://myplaceonline.com/) и вызывает $.mobile.pageContainer.pagecontainer("change", "/", { allowSamePageTransition: true, transition: 'none', reloadPage: true, changeHash: true }); для загрузки удаленной домашней страницы.
  4. В конечном итоге это заставляет JQM вызывать replaceState, который завершается с ошибкой безопасности: 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

Цель всего вышеперечисленного заключается в том, чтобы я не уходил от file:///, потому что если бы я это сделал, я бы потерял доступ ко всем родным JS API телефона через PhoneGap. Это работает на старых версиях iOS и продолжает работать на Android.

Есть какие-нибудь идеи относительно альтернативного способа сделать это, чтобы обойти более строгую безопасность в более новых версиях iOS? Кроме того, я вижу, что есть проблемы, такие как https://github.com/jquery/jquery-mobile/issues/5465, которые предлагают способ отключения истории, и мне интересно, будет ли это еще один обходной путь и что я потеряю?

1 Ответ

0 голосов
/ 23 марта 2019

Добавление следующего кода в обработчик mobileinit устраняет проблему:

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