2014-09-09 2 views
0

Я создаю приложение, которое обертывает интерактивный онлайн-сайт в удобную для использования систему, используя 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; 
}); 

Обновление: Продолжение настройки и перекомпиляции не привело меня к дальнейшему - любому, кто мог бы обратить на это внимание?

+0

У меня возникла такая же проблема, вы нашли решение? – Purva

ответ

0

Вы пытаетесь сделать window.open, чтобы открыть ссылку в окне браузера? В нашем приложении мы делаем это, как этот

<span class="item_link"><a href="#" onclick="window.open(\''+ YourUrl +'\', \'_system\');">' + MoreLink + '</a></span> 
+0

Извините, это не сработает, так как это внешний сайт, изменять HTML-код в HTML не представляется возможным - это нужно делать программно. – chrismcb

1

я не уверен, что это лучший ответ, но я «решил» это путем отслеживания последнего URL, который посетил (через событие startLoad) и когда Я вижу, что кто-то связывается где-то с другим сайтом, чем тот, который уже загружен (используя событие startLoad), я делаю window.open с _system на внешнем URL-адресе, а затем меняю страницу InAppBrowser на последний URL-адрес. (что я отслеживаю).

Не самый элегантный, но я не мог найти другого способа сделать это, и, похоже, он работает неплохо. Использование cordova 3.6.3 (в надежде на обновление на следующей неделе) и inAppBrowser 0.6.0. Возможно, я могу опубликовать фрагменты кода, если кто-то подумает, что это может быть полезно.

+0

Привет, я столкнулся с той же проблемой, могу ли вы поместить какой-то код, чтобы я мог выполнить те же шаги, которые вы сделали? – Purva

+0

Извините, я отказался от этого проекта - возможно, @ larry-l мог бы помочь – chrismcb

Смежные вопросы