Я создаю приложение, которое обертывает интерактивный онлайн-сайт в удобную для использования систему, используя PhoneGap (в частности, PhoneGap Build) и InAppBrowser.Открытие ссылок в браузере по умолчанию с помощью InAppBrowser в PhoneGap/Cordova
Приложение загружается и работает нормально, за исключением одной функции - открытия внешних ссылок в браузере по умолчанию в системе.
Работает на 95%, однако конкретные случаи вызывают проблемы, когда ссылка перенаправляется (например, http://www.facebook.com перенаправляет на https://www.facebook.com перенаправление на https://m.facebook.com).
С моим кодом он обнаруживает, что URL-адрес превышает настроенный домен и открывает его в новом системном окне, но затем загружает два других перенаправления И также загружает его в приложение.
Желаемая операция заключается в том, что она открывает ссылку в браузере по умолчанию в системе и останавливает дальнейшую обработку, включая перенаправление.
Обратите внимание, что просто изменение target
со ссылкой на HTML-страницу на _system
не работает, поскольку оно является внешним по отношению к приложению, так как оно находится с веб-сайта в прямом эфире.
Любые советы и рекомендации приветствуются.
Наиболее важные отрывки кода ниже:
Изнутри приложение PhoneGap:
//Called on deviceready
function launchSite(){
// Get Webpage in InAppBrowser (using the _blank target) and hide it until loaded
iabRef = window.open(url+'?inApp=true'), '_blank', 'location=no,hidden=yes');
//Attach listener for external link intercepting
iabRef.addEventListener('loadstart', iabLoad);
//Attach listener for loading complete
iabRef.addEventListener('loadstop', iabLoaded);
}
//Check if links are external, if they are, open them in the system's default browser
function iabLoad(event){
if(debug) alert('Page load request for ' + event.url);
//Check the link to see if it is external, which is flagged by #appExt from injection.js
if(event.url.indexOf('appExt') > -1){
//Open the window using the _system target to use the system's default browser
if(debug) alert('Opening '+event.url + ' in system window')
window.open(event.url,'_system');
if(debug) alert('Stopping anything more');
//Mobile redirects keep triggering load events from initial link, stop the process now.
window.stop(); // <-Does not stop
}
else{
if(debug) alert('Opening normally without interference');
}
}
//If window was hidden whilst loading, show it now that it has loaded
function iabLoaded(event){
if(debug) alert('Showing IAB window');
iabRef.show();
}
Из файла JavaScript включен в отзывчивый сайт:
function isExternal(url) {
var match = url.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);
if (typeof match[1] === "string" && match[1].length > 0 && match[1].toLowerCase() !== location.protocol) return true;
if (typeof match[2] === "string" && match[2].length > 0 && match[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"), "") !== location.host) return true;
return false;
}
function goToPage(url, external){
if(external)
//Go to new URL with appended hash flag
window.location=encodeURI(url)+'#appExt';
else{
//Show loading screen
$('#app-overlay').css('display','block');
//Wait for 100ms then change page, so the loading screen gets time to show
setTimeout(function(){window.location=encodeURI(url)},100);
}
}
$('a').on('click',function(e){
e.preventDefault();
if(isExternal($(this).attr('href'))){
//If the URL is an external one, the app.js file will open the url in a new window after setting the appExt hash flag
if(debug) alert('Stopping navigation from injection.js as external link detected');
goToPage($(this).attr('href'), true);
}
else{
//Otherwise, continue normally
if(debug) alert('Regular link clicked');
goToPage($(this).attr('href'), false);
}
//Cancel the default link operation, as we've already handled it
return false;
});
Обновление: Продолжение настройки и перекомпиляции не привело меня к дальнейшему - любому, кто мог бы обратить на это внимание?
У меня возникла такая же проблема, вы нашли решение? – Purva