Подключение плагинов в phonegap
Если вы собираете .apk на своей машине, то вам, во-первых, потребуется установить cordova CLI, а после при сборке, вручную подключать плагины, через команду cordova plugin add cordova-plugin-inappbrowser
Но, самое главное для сборки .apk вам потребуется "подгрузить" пакеты для нужной версии android, которые и позволят скомпилировать приложение. Для тех, кто не успел потратить деньги на мощьные процессоры, процесс сборки рискует затянуться на десятки минут.
Для включения плагинов, которые есть в репозитории NPM, при сборке приложения в phonegap нужно лишь прописать в файле конфига config.xml что-то вроде:
<plugin name="cordova-plugin-inappbrowser" />
логи сборки приложения в Phonegap
При этом даже нет необходимости указывать номер версии. Phonegap сам поищет плгагин и подключи его, результат этого вы сможете увидеть в логах сборки (см. скришот).
3 Политики безопасности
$.get( "https://time.jsontest.com/?alloworigin=true", function( data ) {
}).done(function() {
// Загружаем, если сервер ответил валидно
loadtowebview ()
}).fail(function() {
// Подключения нет (ну или сервер завис)
var el = document.getElementById('stat_msg');
el.innerHTML = "Отсутсвует подключение к интернету"
})
Как видете, $.get использует промисоподобную запись. Можно было бы самим написать функцию с промисами, или использовать fetch, но, в таком случае, приложение уж точно не будет рабоать на Android с версиями ниже 5. Так как там используется встроенный webview, и он не поддерживает последние новшества ES. Стоит конечно же, отметить, что вы можете собрать приложения с The Crosswalk Project, который будет использовать свой webview. Но, там тоже есть свои нюансы при сборке...
Собрав приложение, и запустив его, вы скорее всего ничего не увидите на экране. Виной всему политика... безопасности. При сборке приложения стоит учитывать что есть 3 места, о которых вы должны позаботиться.
- файл конфига - config.xml
- тег Content-Security-Policy
- Заголовки сервера
файл конфига - config.xml
Здесь вам нужно указать что-то вроде
<access uri="*" subdomains="true" />
<access origin="*" />
<allow-intent href="https://*/*" />
<allow-intent href="https://*/*" />
Надеюсь что эти строки позволят "пропустить" запросы от вашего приложения к серверу...
тег Content-Security-Policy
Данный тег отвечает так же за возможность Ajax запросов и прочих запросов и загрузки контента...
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content: *">
Укажите эту строку, она разрешает любые запросы и любую загрузку.
Заголовки сервера
Но, все вышеперечисленные разрешения окажуться бессмысленными, если сервер не ответит "хорошим заголовком".
header('Access-Control-Allow-Origin: *');
header("Content-type: application/json; charset=utf-8");
Вообще, если вы, как и я, в своём примере делаете $.get запрос, что бы получить в ответ JSON, тогда в вашем PHP коде можно указать только header("Content-type: application/json; charset=utf-8"); и вернуть JSON данные.
Но, лучше перестраховаться и указать всё что только указывается. Т.к. данный заголовк предназначен для браузера, в нашем случае для webview, а желания разбираться какая версия что предпочитает у меня нет. Поэтому, я обычно указываю
максимально "свободную" политику.
Все три вышеперечисленные нюанса позволят вашему приложени делать запросы к серверу и получать от них ответ, и при этом не молчать как рыбаь в воде. Если у вас нет желания возиться с кодом PHP, то следуйте моему примеру, и отправьте $.get запрос на "https://time.jsontest.com/?alloworigin=true" - он выдаёт валидные заголовки и дату в формате JSON.
Какие нужны папки и файлы что бы собрать приложение в phonegap (cordova)
<icon src="/icon.png" //>
Это всё что нужно для успешной сборки под Android, а может быть даже и под Iphone
Финальный листинг
- config.xm
- index.html
- jQuery - библиоткеа. (вы же хотите использовать её методы для отправки запросов, и проверки интернета)
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.businessapp.sitevisitor" version="1.0.0" xmlns="https://www.w3.org/ns/widgets" xmlns:cdv="https://cordova.apache.org/ns/1.0">
<name>Накрутка счётчика посещений</name>
<description>
Обмен визитами на сайт
</description>
<author email="This email address is being protected from spambots. You need JavaScript enabled to view it." href="https://businessapp.trade/">
Business App
</author>
<access uri="*" subdomains="true" />
<access origin="*" />
<allow-intent href="https://*/*" />
<allow-intent href="ws://*/*" />
<allow-intent href="wss://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<preference name="android-minSdkVersion" value="14" />
<preference name="android-targetSdkVersion" value="26" />
<allow-intent href="market:*" />
<allow-intent href="ws://*/*" />
<allow-intent href="wss://*/*" />
<access uri="*" subdomains="true" />
<access origin="*" />
<icon src="/icon.png" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<preference name="BackupWebStorage" value="none" />
<icon src="/icon.png" />
</platform>
<preference name="DisallowOverscroll" value="true" />
<plugin name="cordova-plugin-whitelist" spec="~1.2.0" />
<plugin name="cordova-plugin-console" spec="~1.0.1" />
<plugin name="cordova-plugin-statusbar" spec="~1.0.1" />
<plugin name="cordova-plugin-inappbrowser" />
</widget>
config.xml
<html>
<head>
<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content: *">
<title>Site Visitor</title>
<script type="text/javascript" charset="utf-8" src="/jquery-3.4.0.min.js"></script>
<script type="text/javascript" charset="utf-8" src="/cordova.js"></script>
<script type="text/javascript" charset="utf-8">
// Ждём загрузки API устройства
function onLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
console.log('устройстов готово')
}
// API загрузились...
function onDeviceReady() {
// Все необходимые библиотеки загрузились и их можно использовать
go()
}
// Загрузка сайта в WebView
function loadtowebview () {
window.open = cordova.InAppBrowser.open;
var el = document.getElementById('stat_msg');
el.innerHTML ='Начинаем загрузку'
cordova.InAppBrowser.open('https://businessapp.trade', '_self', 'location=no, toolbar=no, hidenavigationbuttons=yes, zoom=no');
}
// Проверяем доступен ли интернет
function go () {
var el = document.getElementById('stat_msg');
el.innerHTML ='Проверка связи';
$.get( "https://time.jsontest.com/?alloworigin=true", function( data ) {
}).done(function() {
el.innerHTML ='Проверка связи'
loadtowebview ()
}).fail(function() {
noinet ()
})
}
var noinet = function () {
var el = document.getElementById('stat_msg');
el.innerHTML = "<h3>Отсутсвует подключение к интернету</h3><br><input type=button value='перезагрузить' onclick='go()'>"
document.getElementById('preloaderimg').src = 'noinet.png'
}
</script>
<style>
.msg_wrap {
display:flex; width:100%; height:100%; justify-content: center; align-items: center; flex-direction: column;
}
body {
background: #2a80b9; width:100%; height:100%;
}
#stat_msg {
color: antiquewhite;
font-size: larger;
display: flex;
flex-direction: column;
}
#stat_msg input {
height: 50px;
}
</style>
</head>
<body onload="onLoad()" >
<div style="display:flex; width:100%; height:100%">
<div class="msg_wrap">
<div id="stat_msg">
</div>
<div>
<img id='preloaderimg' src="/preloader1.gif" width="400px">
</div>
</div>
</div>
</body>
</html>