3 votes

Impossible d'interagir avec quoi que ce soit dans l'application Cordova

J'ai du mal à obtenir une quelconque interactivité de mon premier projet Cordova. J'ai de l'expérience en HTML, Javascript et CSS, et je pensais que Cordova serait une introduction parfaite au développement d'applications hybrides, mais je n'arrive pas à faire fonctionner un bouton HTML, même basique, dans l'application.

J'utilise Windows 10 avec Android Studio et Cordova installés. Je pense avoir configuré la structure des fichiers du projet correctement. J'ai suivi les docs de Cordova et j'ai installé le plugin de géolocalisation sur tous les types d'appareils. Pour les tests, j'utilise à la fois les appareils Android virtuels dans Android Studio, et un téléphone Android (OnePlus X), il est connecté correctement (l'application s'ouvre sur le téléphone chaque fois que je tape "cordova run Android" dans la console).

J'ai commencé par essayer d'obtenir ma position actuelle, puis d'afficher les coordonnées sous forme d'alerte. Cela ne fonctionnait pas, alors pour essayer quelque chose de plus simple, j'ai ajouté un bouton qui devrait afficher une fenêtre d'alerte lorsqu'on clique dessus, mais aucun des deux ne fonctionne. Voici mon code actuel :

www/index.html

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
        <link rel="stylesheet" type="text/css" href="css/index.css">
        <title>Hello World</title>
    </head>
    <body>  
        <div class="app">
            <h1 id="headertext">My first Cordova App!</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received" id="geolocation">Device is ready!</p>
            </div>
            <br>
            <div>
            <button type="button" onclick="basicAlertTest();">Click Me!</button>
            </div>
        </div>

        <script type="text/javascript" charset="utf-8">
            // onSuccess Callback
            // current GPS coordinates
            var onSuccess = function(position) {
                alert('Latitude: '          + position.coords.latitude          + '\n' +
                      'Longitude: '         + position.coords.longitude         + '\n' +
                      'Altitude: '          + position.coords.altitude          + '\n' +
                      'Accuracy: '          + position.coords.accuracy          + '\n' +
                      'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
                      'Heading: '           + position.coords.heading           + '\n' +
                      'Speed: '             + position.coords.speed             + '\n' +
                      'Timestamp: '         + position.timestamp                + '\n');
            };

            // onError Callback receives a PositionError object
            function onError(error) {
                alert('code: '    + error.code    + '\n' +
                      'message: ' + error.message + '\n');
            }

            // Listening for the device to be ready
            document.addEventListener("deviceready", onDeviceReady, false);
            function onDeviceReady() {
                console.log("navigator.geolocation should be able to run successfully now...");
                navigator.geolocation.getCurrentPosition(onSuccess, onError);
            }

            // Checking to see if a basic alert will appear on click of "Click me!" button
            function basicAlertTest(){
            alert("This is the alert test, button works!");
            }
        </script>

        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>

    </body>
</html> 

Y a-t-il quelque chose de fondamental qui m'échappe ? Je pensais être capable de coder en HTML/Javascript/CSS comme d'habitude, mais j'aurais besoin d'apprendre quelques lignes de code pour intégrer les plugins qui utilisent les fonctionnalités natives de l'appareil (comme la géolocalisation ou l'appareil photo). Je me suis assuré d'installer le plugin de géolocalisation (à l'aide de cordova plugin add cordova-plugin-geolocation ), mais l'alerte n'apparaît pas. Ai-je besoin d'un plugin séparé pour afficher les alertes/interagir avec l'écran ?

De plus, j'ai remarqué qu'à chaque fois que je le teste virtuellement, si je regarde l'emplacement dans "Contrôles étendus", les coordonnées qu'il donne sont :

Longitude: -122.0840 Latitude: 37.4220 Altitude: 0.0

Qui est Mountain View, CA, à environ 8000 miles de moi ¯_(ツ)_/¯.

Voici une capture d'écran :

enter image description here

Je le teste localement, est-ce que cela fait une différence ? J'apprécierais vraiment toute aide ou conseil à ce sujet, je rate probablement quelque chose de vraiment évident. Merci d'avance !

MISE À JOUR 1 La liste des plugins installés renvoyée par "cordova plugin ls" :

cordova-plugin-compat 1.0.0 "Compat" cordova-plugin-dialogs 1.3.0 "Notification" cordova-plugin-geolocation 2.4.0 "Geolocation" cordova-plugin-whitelist 1.3.0 "Whitelist"

MISE À JOUR 2

En onSuccess est censée s'exécuter une fois que l'appareil est prêt. Lorsqu'elle s'exécute, elle doit afficher une alerte contenant les détails de l'emplacement, mais comme je recevais le message "appareil prêt" sans qu'aucune alerte n'apparaisse, j'ai décidé d'ajouter un bouton pour appeler manuellement la fonction.

Je suis maintenant certain onSuccess ne s'exécute pas correctement lorsque le périphérique est prêt, car lorsque je clique sur le bouton pour l'exécuter manuellement, l'erreur suivante s'affiche dans la console :

Uncaught TypeError: Cannot read property 'coords' of undefined

Je suis confus car j'utilise le même code que celui indiqué ici : https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-geolocation/index.html

De plus, j'ai remarqué que le modèle d'index sur lequel je travaille contient <script type="text/javascript" src="cordova.js"></script> Cependant, lorsque je regarde le dossier contenant mon fichier d'index, il n'y a pas de fichier cordova.js, il n'est pas situé à cet endroit et je n'arrive pas à le trouver dans le téléchargement de Cordova.

Dernière tentative :

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Security-Policy" content="default-src * gap://ready file:; style-src 'self' 'unsafe-inline' *; script-src 'self' 'unsafe-inline' 'unsafe-eval' *; img-src * data: 'unsafe-inline'">
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
        <link rel="stylesheet" type="text/css" href="css/index.css">
        <title>Hello World</title>

        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
    </head>
    <body>  
        <div class="app">
            <h1 id="headertext">My first Cordova App!</h1>
            <div id="deviceready" class="blink">
                <p class="event listening">Connecting to Device</p>
                <p class="event received" id="geolocation">Device is ready!</p>
            </div>
            <br>
            <div>
            <button type="button" onclick="basicAlertTest();">Click Me!</button>
            <button type="button" onclick="onSuccess();">Run onSuccess function</button>
            </div>
        </div>

        <script type="text/javascript" charset="utf-8">

                   // onSuccess Callback
            // current GPS coordinates
            var onSuccess = function(position) {
                alert('Latitude: '          + position.coords.latitude          + '\n' +
                      'Longitude: '         + position.coords.longitude         + '\n' +
                      'Altitude: '          + position.coords.altitude          + '\n' +
                      'Accuracy: '          + position.coords.accuracy          + '\n' +
                      'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
                      'Heading: '           + position.coords.heading           + '\n' +
                      'Speed: '             + position.coords.speed             + '\n' +
                      'Timestamp: '         + position.timestamp                + '\n');
            };

            // onError Callback receives a PositionError object
            function onError(error) {
                alert('code: '    + error.code    + '\n' +
                      'message: ' + error.message + '\n');
            }

            // Listening for the device to be ready
            document.addEventListener("deviceready", onDeviceReady, false);
            function onDeviceReady() {
                console.log("navigator.geolocation should be able to run successfully now...");
                navigator.geolocation.getCurrentPosition(onSuccess, onError);
            }

            // Checking to see if a basic alert will appear on click of "Click me!" button
            function basicAlertTest(){
            console.log("This is the alert test, button works!");
            alert("This is the alert test, button works!");
            }
        </script>

    </body>
</html>

3voto

Supprimez cette ligne en haut de votre fichier index.html

<meta http-equiv="Content-Security-Policy" content="default-src * gap: ws: https://ssl.gstatic.com;style-src * 'unsafe-inline' 'self' data: blob:;script-src * 'unsafe-inline' 'unsafe-eval' data: blob:;img-src * data: 'unsafe-inline' 'self' content:;fmedia-src mediastream;">

1voto

Hoon Points 240

Mettez une condition supplémentaire pour vérifier si le plugin de géolocalisation est bien installé sur votre application. Donc, ce sera comme ça,

if(navigator.geolocation){
  console.log('Geolocation is there');
  navigator.geolocation.getCurrentPosition(function(position) {
    alert('Latitude: '          + position.coords.latitude          + '\n' +
                  'Longitude: '         + position.coords.longitude         + '\n' +
                  'Altitude: '          + position.coords.altitude          + '\n' +
                  'Accuracy: '          + position.coords.accuracy          + '\n' +
                  'Altitude Accuracy: ' + position.coords.altitudeAccuracy  + '\n' +
                  'Heading: '           + position.coords.heading           + '\n' +
                  'Speed: '             + position.coords.speed             + '\n' +
                  'Timestamp: '         + position.timestamp                + '\n');
  } , function(error) {
    console.log('Error while connecting to geolocation ' + error);
  }, {timeout:10000});
} else {
  console.log('Geolocation is not there');
}

1voto

Stefan Aleksik Points 19

Essayez d'utiliser ce Contenu - Sécurité - Politique, cela devrait fonctionner.

<meta http-equiv="Content-Security-Policy" content="default-src * gap: ws: https://ssl.gstatic.com;style-src * 'unsafe-inline' 'self' data: blob:;script-src * 'unsafe-inline' 'unsafe-eval' data: blob:;img-src * data: 'unsafe-inline' 'self' content:;fmedia-src mediastream;">

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X