2015-06-22 2 views
2

Я разрабатываю приложение Android и iOS с помощью Cordova.iframe history.back() проблемы в приложении Cordova (iOS)

Структура страницы выглядит следующим образом.
- Страница A (без фрейма)
- Страница B (ж/IFrame)

Переходы
1. Страница А -> страница B (вперед)
2. Страница A < - Страница B (назад by history.back())

iframe отображает внешнюю веб-страницу.
Когда он возвращается на страницу A (без iframe) из страницы B (w/iframe), я должен вызвать hisotory.back() дважды.
Однако для создания Android-приложения одним и тем же источником javascript необходимо вызвать history.back() один раз.
Кроме того, подобная проблема не возникает, когда используется собственный WebView (UIWebView) iOS.

Является ли это спецификацией Cordoba (iOS) или ошибкой?
Кто-нибудь испытал эту проблему?

Версии
Кордова 4,2 (IOS платформы 3.8.0)
IOS 8,3

Благодарности.

+1

Прежде всего: Пожалуйста, не тяните свой вопрос в список рассылки разработчиков в Кордове, это просто для развития Кордовы. Почему вы используете iFrames? – Joerg

+0

Спасибо, Йорг. Прошу прощения за ошибку. Причиной использования iframe являются требования клиентов. Конечно, мы предложили InAppBrowser. Однако он был отклонен по следующим причинам. 1. Не показывайте URL-адрес сайта. 2. Должен быть в состоянии вернуться на предыдущую страницу, когда используется iOS. Разве Кордова не рекомендует использовать iframe? – LaPlace

ответ

0

Во-первых, iframe в iOS делится своей историей. Во-вторых, Cordova в iOS использует iframe как JsToNativeBridge.

Таким образом, в вашем приложении есть два фрейма. Используется для показа вашей страницы. другой используется для JsToNativeBridge. (Этот iframe скрыт)

Функция history.back конфликтует с этими двумя iframe.

Одно из решений следующее.

После deviceready события, прежде чем любой плагин делает работу, выполнить этот

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

замечанием некоторые плагины используют addEventlistener для deviceready события. Если вы используете такой плагин , попробуйте следующее решение.

Другие решения для модификации cordova.js в iOS.

До:

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

После:

if (bridgeMode === undefined) { 
    bridgeMode = jsToNativeModes.XHR_NO_PAYLOAD; 
    // bridgeMode = jsToNativeModes.IFRAME_NAV; 
} 
Смежные вопросы