Phonegap Build CLI-5.2.0 Загрузка и закрытие изнутри веб-приложения

Я боролся с вызовами в открытое окно, используя inappbrowser из своего приложения. В основном, я использую phonegap в качестве обертки для загрузки мобильного сайта CMS с специальными функциями приложения.

Вот index.html. Я использую inappbrowser (с местоположением установлено no).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Emerald Test App</title>
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="viewport" content="width=device-width" /> 
    <script src="phonegap.js"></script>

    <script type='text/javascript'>
      var ref = null;
      function onLoad() {
       document.addEventListener("deviceready", onDeviceReady, false);
      }


     function onDeviceReady() {

      var url = 'https://my-cms-site.com/content.aspx?page_id=31&org_id=1&app=1';
      var target = '_blank';
      var options = "location=no"
      ref = cordova.InAppBrowser.open(url, target, options);

     }

</script>
</head>


<body onload="onLoad()">
</body>
</html>

То, что я ищу, - это открытые ссылки в системном браузере - с моего внешнего сайта, загруженного через inappbrowser

Я пробовал загружать файлы, используя похожие документы и предложения из сообщений вроде

<script type="text/javascript">
        window.open(url, '_system');
</script>

И _blank, добавив "location = no" и т.д., но не кубики. Это внешние страницы, загруженные с моего удаленного сайта.

При нажатии этих ссылок они открываются в том же браузере (inappbrowser или webview) и захватывают браузер. Я хочу открыть их в другом системном браузере (хром, сафари, что угодно). Это позаботится о моей проблеме с загрузкой (поскольку файлы, мы надеемся, откроются в системном браузере, и пользователь сможет выяснить, что с ними делать).

Я попытался добавить прослушиватель событий и executescript, чтобы вернуть значение href. Затем используйте это значение для window.open(href, '_ system'); из index.html(вместо удаленной страницы). Потому что по индексу я все равно буду ссылаться на inappbrowser.

   ref.addEventListener( "loadstop", function() {
   ref.executeScript(
        { code: "var gbal = null; $('a').on('click', function() { gbal = $(this).attr('href'); }); (function runIt() { return gbal })();" },
        function( values ) {
            if (values != null) {
            //alert( values[ 0 ] );
             window.open(values[0],'_system');
            }

        }
          );
       });
   }

Значения [0] всегда равны нулю. Который, кажется, указывает, что я не делаю что-то правильно в коде: часть executescript - или $(это) на самом деле не эта

Итак, большой вопрос - как я могу открывать ссылки на моем внешнем сайте в системном браузере. window.open('whatever.htm', '_XXXXX') не имеет значения, когда вызывается на моем удаленном сайте. Я нахожусь на правильном пути, используя прослушиватель событий?

Ответ 1

Отвечая на мой собственный вопрос, так что любой, кто сталкивается с подобной ситуацией, может получить солидный ответ. Я собрал это вместе с другими сообщениями, ссылками и документацией.

Итак, вы хотите открыть ссылку на внешний браузер на удаленном загруженном сайте в InAppBrowser?

На удаленном сайте вам нужно будет включить script src в файл cordova.js, файл cordova_plugins.js и включить вашу папку плагинов. Эти файлы должны размещаться на удаленном сайте. Я предпочитаю загружать шахту условно, если знаю это "приложение". Файлы кордовы при загрузке будут вызывать серию предупреждений, поэтому вы не захотите их загрузить, если не знаете этого приложения.

введите описание изображения здесь

Где вы получаете эти файлы? Я установил Phonegap Desktop и использовал файлы из сборки, но имел некоторые ссылочные ошибки. Вместо этого я использовал Phonegap Build и извлек файлы из APK. Переименовал appname.apk в appname.apk.zip и извлек/скопировал необходимые js файлы на мой сервер. * Есть некоторые проблемы с различиями в платформе, и файл cordova.js необходимо будет изменить и условно загрузить для iOS/Android.

Это необходимо, поэтому у вас есть дескрипторы для inappbrowser (и в случае моего требования "закрыть приложение" - навигатор).

На моем удаленном (внешнем) сайте (после загрузки кордоны/плагинов) я могу закрыть приложение с помощью простого вызова navigator.app.exitApp();

На страницах моего удаленного (внешнего) сайта, загруженного в inappbrowser, теперь я могу открывать ссылки на внешних страницах, делая что-то вроде этого:

<a onclick="loadUrl('http://google.com'); return false;" href="#">Test link, don't click</a>

<script type="text/javascript">
$('.closeapp').click(function() {
navigator.app.exitApp(); //this only works on Android. iOS doesn't allow for programmatic exit
});
function loadUrl(url){
    navigator.app.loadUrl(url, { openExternal:true });
    return false;
}
</script>

Я планирую несколько раз модифицировать функцию loadURL, используя jquery, для обработки щелчка и поиска класса. Что-то вроде:

$('.downloadable').click(function() {
var url = $(this).attr('href');
navigator.app.loadUrl(url, { openExternal:true });
});

Вышеуказанное работает только для Android. Попробуйте vanilla window.open('http://www.whatever.com', '_system') не открывает внешний браузер в iOS с моего внешнего сайта, Я думал об использовании другого ref = cordova.inappbrowser.open() из моего внешнего сайта? Это не работает. У кого-нибудь есть идеи?