1°/ Le développement mobile en JS

Il existe à l'heure actuelle plusieurs approches pour créer des applications mobiles à l'aide d'environnements JS. On peut globalement les répartir en 3 catégories :

  • celles qui permettent de produire une application totalement native. Dans le cadre de vuejs, on peut citer, vue-native (qui produit du code pour react-native) et nativescript-vue,
  • celles dites hybrides, qui utilisent une webview pour simuler un navigateur et exécuter le code de l'application, mais en utilisant des plugins qui permettent d'accéder nativement au matériel. Les principaux plugins sont capacitor et cordova et les environnements les plus connus sont ionic-vue et quasar.
  • celles qui utilisent uniquement les capacités de navigateurs modernes pour accéder au matériel, mais qui proposent tout de même une expérience utilisateur similaire aux application natives, grâce à la gestion d'un cache pour les ressources, ce qui permet d'utiliser l'application hors-ligne. On appelle ce type d'application PWA, pour Progressive Web Application. Il existe un plugin pwa pour vue.

 

Remarque : grâce à capacitor, il est possible de mixer hybride et pwa puisqu'il est capable de détecter si le matériel est accessible nativement et si ce n'est pas le cas, d'utiliser les capacités du navigateur.

 

  • Ce TD est découpé en 2 parties : la première consacrée à quasar, couplé à cordova ou capacitor, et la deuxième consacrée à ionic + capacitor.
  • Ces deux environnements sont relativement identiques dans la façon de créer une application :
    • on utilise un set de composants graphiques propre à l'environnement,
    • on utilise android studio pour tester dans un émulateur ou bien sur un téléphone réel l'application,
    • on peut faire du développement "interactif", comme avec une application web SPA classique servie par un serveur web de développement,
  • Il y a malgré tout des différences entre ces 2 solutions :
    • ionic est plutôt pensé pour développer en typescript, et plutôt js "classique" pour quasar,
    • quasar propose un visuel de composants graphique unique, plutôt dans le style material design (donc orienté android), alors que ionic propose un look différent selon l'architecture cible.
    • créer un projet ionic-vue est un peu plus simple car il y a des installations automatiques. En revanche, on peut moins facilement configurer la création du projet que sous quasar.
    • quasar permet à priori de créer bien plus de types d'application que ionic qui est avant tout fait pour des applications sur mobile (même s'il peut être utilisé pour d'autres architecture).
    • quasar est plus vieux, plus stable, mieux documenté, plus fourni en composants que ionic-vue.

 

2°/ Mise en place logicielle préalable

 

2.1°/ Installation d'android studio

 

  • Quelle que soit l'environnement choisi, il faut auparavant installer tout ce qui concerne les plateforme natives, donc xcode ou android studio.
  • Ce qui suit concerne uniquement android, qui ne pose aucune contrainte matérielle telle que avoir un mac.

Remarque : les machines du département sont déjà installées avec la configuration décrite ci-dessous. Vous ne devez donc suivre ces étapes que pour faire l'installation sur une machine personnelle.

  • La première étape consiste à télécharger Android-studio : http://developer.android.com/studio
  • Vous obtenez une archive avec un nom du type : android-studio-2023.1.1.28-linux-tar.gz
  • Dans un terminal, en tant que root, lancez les commandes suivantes :
mv android-studio-2023.1.1.28-linux-tar.gz /usr/local/
cd /usr/loca/
tar zxf android-studio-2023.1.1.28-linux-tar.gz
  •  Cela crée un répertoire /usr/local/android-studio, dans lequel se trouve les binaires de l'application
  • Il faut maintenant configurer le logiciel pour un utilisateur "normal", notamment afin de télécharger le Sdk.

 

  • Dans un terminal, allez dans votre home directory et lancez : /usr/local/android-studio/bin/sutio.sh
  • L'installateur affiche une série de fenêtre pour choisir la configuration. après avoir accepté la licence, l'installation du Sdk se lance.
  • Cela crée un répertoire Android/Sdk dans votre home directory.
  • Il faut maintenant télécharger différents outils et plateformes de développement 
  • Dans la fenêtre d'accueil d'android studio, choisir "Customize" puis "All settings", comme indiqué dans l'image ci-dessous

install androidsdk 001

 

  • Dans la fenêtre de configuration, aller dans "Appearance & Behaviour" > "System settings" > "Android SDK", puis cliquer sur l'onglet "SDK Platforms" comme indiqué sur l'image ci-dessous.
  • Ensuite, sélectionner certaines plateformes à installer. Seules les versions 10 et 11 peuvent être cochées, car cordova et capacitor ne sont pour l'instant pas compatibles avec des versions plus récentes.
  • ATTENTION ! les versions 10 & 11 ne sont pas disponibles sur tous les téléphones. Si vous voulez créer une application plus "compatible", il faudra installer des versions de plateforme plus anciennes (V9 voire V8)

install androidsdk 002

 

  • Cliquez ensuite sur l'onglet "SDK Tools" et si besoin cochez les cases Android SDK Build-Tools, Android SDK command-line Tools, Android Emulator, Android SDK Platform-Tools, comme indiqué dans l'image ci-dessous.

install androidsdk 003

 

  • Cochez la case "Show Package Details" et vérifiez que les Build-Tools version 30.0.3 et 33.0.1 sont bien cochés, comme indiqué dans l'image ci-dessous

install androidsdk 004

 

  • Cliquez ensuite sur "Apply" pour valider les choix. Après acceptation de la licence, les téléchargements commencent.

 

  • Il faut à présent créer au moins un simulateur de téléphone.
  • Pour cela, fermer la fenêtre de configuration pour revenir à l'écran d'accueil et cliquer sur "Project" puis sur l'icône paramètres en haut à droite (3 points verticaux) et choisir "Virutal Device Manager", comme indiqué sur li'mage ci-dessous.

install androidsdk 005

 

  • Dans le fenêtre, cliquer sur le bouton "Create Device", puis choisir un modèle, par exemple le Pixel 2, comme indiqué dans l'image ci-dessous

install androidsdk 006

 

  • Cliquer sur "Next", puis choisir un OS pour le simulateur. Il est fort possible que l'OS ne soit pas déjà disponible, auquel cas, il faut le télécharcer en cliquant sur la flèche à côté du nom, comme indiqué dans l'image ci-dessous.

install androidsdk 007

 

  • Une fenêtre s'ouvre puis le téléchargement commence.
  • Une fois terminé, terminer la configuration, notamment en donnant un nom au simulateur, son orientation, etc.
  • Une fois la création terminée, le simulateur est disponible dans la liste de l'écran d'accueil.
  • Pour vérifier que tout fonctionne, cliquez sur la flèche pour lancer l'émulateur. Une fenêtre ressemblant au téléphone apparaît, puis après quelques dizaines de secondes, l'écran d'accueil android s'affiche.
  • Il est ensuite possible d'interagir comme sur un téléphone réel, bien que certaines opérations fassent "ramer" l'émulateur.

 

  • La dernière étape consiste à indiquer au système d'exploitation les chemins d'accès au SDK de android-studio.
  • Pour cela, il faut éditer le fichier .bashrc (ou .profile, selon votre cas) et ajouter à la fin, quelque chose du genre :
################################
# Android SDK
###############################
export ANDROID_HOME="/home/toto/Android/Sdk"
export ANDROID_SDK_ROOT="/home/toto/Android/Sdk"
export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/platform-tools:$ANDROID_SDK_ROOT/emulator
  •  Il faut bien entendu remplacer /home/toto par le chemin vers votre propre répertoire Android/Sdk

 

2.2°/ Installation de gradle

  • Pour compiler les projet quasar, il faut faire appel au logiciel gradle.
  • Malheureusement, le plugin gradle installé avec le sdk android n'est pas directement utilisé par quasar.
  • Il faut donc installer gradle séparément. 
  • Pour cela, d'aller sur https://gradle.org/releases/ et de télécharger l'archive binary-only de la version 8.2  ou supérieure.
  • En tant que root, copier l'archive téléchagée gradle-8.2-bin.zip dans /usr/local et la décompacter.
  • Ensuite, il suffit d'ajouter le chemin d'accès à l'exécutable de gradle dans son .bashrc :
################################
# Gradle
###############################
export PATH=$PATH:/usr/local/gradle-8.2/bin

 

2.3°/ Installation des paquets node pour quasar, cordova

  • Il suffit d'utiliser npm pour faire un installation globale :
npm install -g @quasar/cli
npm install -g cordova

 

2.4°/ Utilisation de la version 11 de Java

  • Le plus gros piège pour créer des projets avec cordova est qu'il faut utiliser la bonne version de Java.
  • Même si le Sdk android n'est pas basé sur une version fixée de Java, Android studio est en revanche fourni avec la v11 de Java.
  • Au cas où il n'y ait pas de JDK/JRE installé sur votre machine, il est donc possible d'exécuter android studio grâce à cette V11 de Java.
  • Cependant, il est fréquent qu'une machine soit installée avec un JDK général au système très récent, par exemple en utilisant les paquets openjdk-17-jdk.
  • Si votre machine est effectivement installée avec la v17, voire plus récente, cela va poser des erreurs lors de la compilation de votre projet quasar.
  • Il faut obligatoirement utiliser la v11 et donc l'installer si ce n'est déjà fait : apt-get install openjdk-11-jdk
  • Sous debian, il est facile de passer d'une version à une autre, en étant root
update-alternatives --config java
  • Il suffit de choisir le n° de menu correspond à la v11.

 

3°/ Création d'un projet quasar

3.1°/ Initialisation du projet

  • Le plus simple est de partir d'un projet d'exemple créé avec les commande quasar :
npm init quasar
  •  Le générateur de projet vous pose différentes questions, notamment sur les versions des différents environnements/outils à utilisé
  • La plupart du temps, il suffit de prendre la réponse déjà sélectionnée, mais voici une liste des réponses "conseillées" :
    • 1ère question : App with Quasar CLI
    • 2ème : mettez le nom de votre projet
    • 3ème question : Quasar v2
    • 4ème question : Javascript (sauf si vous préférez le typescript)
    • 5ème question : Quasar App CLI with Webpack. ATTENTION : il est souvent conseillé d'utiliser Vite comme gestionnaire de construction du projet au lieu de webpack. Malheureusement, même si Vite bien plus performant que webpack, il y a des problèmes de compatibilité dès lors que l'on utilise des plugins capacitor. C'est pourquoi, il faut choisir webpack.
    • 6ème question : à priori le nom de votre projet
    • 7ème question : le nom de votre application, qui sera utilisé comme nom lors de l'installation sur mobile.
    • 8ème, 9ème question : ce que vous voulez
    • 10ème : Sass with CSS syntaxe
    • 11ème question : utilisez les flèches haut/bas puis espace pour sélectionner des plugins. Normalement, ESLint est déjà sélectionné. Si vous avez besoin d'un store, il est conseillé d'utiliser Pinia, qui remplace Vuex avantageusement, tout en étant quasi similaire au niveau du fonctionnement. Vous pouvez également sélectionner Axios si besoin et Vue-i18n pour mettre en place une application multilangue.
    • 12ème question : Prettier ou Standard
    • 13ème qestion : Yes, use npm
  • Une fois le projet créé, vous pouvez aller dans son répertoire et constater que l'on retrouve à peu près la même structure qu'un projet vuejs classique, avec un router.
  • Il y a quelques différences dans les noms de certains répertoires, et bien entendu le fait que les composants sont définis en utilisant la nouvelle syntaxe introduite par la v3 du vujes.
  • Il est cependant toujours possible d'utiliser des composants écrits avec la syntaxe de la v2.
  • Pour la définition de l'interface utilisateur, quasar repose sur un ensemble de composants relativement semblable à vuetify, y compris dans leur mise en oeuvre.
  • Le placement des composants est un peu différent, mais se base quand même sur une logique flexbox, avec des noms de classe css qui permettent de définir des lignes et des colonnes de composants.
  • Pour tous les détails de l'API quasar : https://quasar.dev/

3.2°/ Tester l'application SPA dans un navigateur

  • Pour lancer un serveur de développement et tester l'application :
quasar dev
  • Normalement, cela lance directement le navigateur avec l'URL servie (par défaut http://localhost:9000)
  • Comme pour les projets classiques, on peut modifier le code et voir en direct les changements.

3.3°/ Construire l'application SPA pour la production

  • Pour construire l'application :
quasar build
  • Cette commande crée un répertoire dist/spa à la racine du projet, avec les sources produits par la compilation.
  • Pour tester cette version de production :
// on suppose que l'on est à la racine du projet
cd dist/spa
quasar serve

 

3.4°/ Et electron ?

  • Quasar est très versatile puisqu'il permet de faire du dev. en vue de construire l'applicaiton sous forme d'un exécutable, grâce à electron.
  • Pour tester l'application :
quasar dev -m electron
  • Et pour construire l'executable :
quasar build -m electron
  • Cette commande crée un répertoire dist/electron à la racine du projet, avec les produits de la compilation.
  • Sous linux, le sous-répertoire Packaged contient la version prête à être exécutée.
 

 

3.5°/ Tester l'application en mode mobile android avec capacitor

  • Il est possible d'ajouter capacitor et les plugins que l'on veut, avant de lancer un serveur de dev.
  • Cependant, si cet ajout n'a pas été fait, la commande ci-dessous permet au moins d'installer et configurer la base de capacitor pour que le projet puisse se lancer sous android studio :
quasar dev -m capacitor -T android

Remarque : si ce n'est déjà fait, cette commande va créer un répertoire src-capacitor à la racine du projet.

ATTENTION :

  • Selon la version de quasar que vous utilisez, il est possible qu'il crée un projet capacitor avec des paquets npm en version "ancienne", comme la v2. Cela pose de nombreux problème car capacitor en est à la v5 et la plus par des exemples que l'on trouve sont pour la v4 ou supérieure
  • Pour vérifier si vous avez la bonne version, il suffit d'aller dans src-capacitor et consulter le fichier package.json. Si vous voyez une ligne du type : "@capacitor/core": "2.0.0", c'est que quasar a utilisé une ancienne version.
  • Pour le forcer à utiliser une version récente, par exemple la v5, il faut reinstaller les paquets. Pour cela :
cd src-capacitor
rm -rf node_modules
rm package-lock.json
  •  Ensuite, il faut éditer le fichier package.json et modifier la liste des paquets avec :
   "dependencies" : {
        "@capacitor/core": "^5.0.0",
        "@capacitor/cli": "^5.0.0",
        "@capacitor/android": "^5.6.0",
    }
  • Ensuite, il suffit de lancer l'installation : npm install

 

  • Si le projet fait appel à des plugins capacitor tels que la caméra, il faut également les installer. Par exemple, pour utiliser la caméra :
npm install @ionic/pwa-elements
npm install @capacitor/camera

 

  • Lors du premier lancement, un certain nombre de paquets vont être téléchargés, et un projet android studio créé.
  • Ensuite android studio se lance automatiquement et vous demande s'il doit "faire confiance" à ce projet.
  • En cliquant sur "Trust", le projet est ouvert et il est possible de le lancer avec le simulateur de mobile de votre choix.
  • Si vous modifiez un fichier source, les changements provoquent une recompilation et le résultat apparaît directement dans android studio.

3.6°/ Construire l'application mobile pour la production

  • Pour construire l'application :
quasar build -m capacitor -T android
  • Cette commande crée un répertoire dist/capacitor à la racine du projet, avec un sous-sous... répertoire contenant le fichier .apk d'installation.
  • Attention, ce fichier est à la base non-signé et ne pourra pas forcément être installé sur un mobile.
  • Pour le rendre disponible sur play store, suivre les indications données ici :  https://quasar.dev/quasar-cli-webpack/developing-capacitor-apps/publishing-to-store

3.7°/ Et cordova ?

  • Cordova étant le prédécesseur de capacitor, il n'a pas tous les avantages et améliorations de ce dernier. Par exemple, quand on accède à un périphérique (matériel ou logiciel) du mobile, capacitor est capable de détecter si celui-ci est disponible et accessible afin d'utiliser un accès natif, et sinon, de passer par les capacités du navigateur, à la façon d'une application PWA.
  • Cependant, si cordova est réellement nécessaire, alors il suffit de remplacer le mot-clé capacitor par cordova dans les commandes données ci-dessus.
  • La différence est qu'avec cordova, l'émulateur est directement lancé, plutôt que de passer par android studio.

 

4°/ Exemples

4.1°/ Sources

 

 

  • Pour illustrer les plugins de capacitor, il existe également de nombreux tutoriels, notamment sur le site même de capacitor : https://capacitorjs.com/docs/apis
  • Capacitor est globalement fait pour être indépendant de l'environnement de développement. Il est donc facile d'adapter les exemples à une application quasar.
  • On peut même utiliser le très bon exemple provenant du framework ionic :https://ionicframework.com/docs/vue/your-first-app
  • En effet, à part les composants ionic qui changent, la partie capacitor est globalement la même.

 4.2°/ mini tutoriel avec prise de photo

  • lancer npm init quasar pour créer un projet, en prenant bien garde de sélectionner webpack comme builder.
  • la suite suppose que le répertoire du projet est testquasar.
  • lancer les commandes suivantes :
cd testquasar
quasar mode add capacitor
cd src-capacitor
rm -rf node_modules
rm package-lock.json

 

  •  Si besoin (par ex, version ancienne de capacitor), éditer le fichier package.json et modifier les dépendances avec :
"dependencies": {
    "@capacitor/cli": "^5.0.0",
    "@capacitor/core": "^5.0.0"
    "@capacitor/android": "^5.6.0",
  }
  •  lancer les commandes suivantes :
npm install
npm install @capacitor/android
npm install @ionic/pwa-elements
npm install @capacitor/camera
cd ..
npm install @ionic/pwa-elements
npm install @capacitor/camera

Remarque : il est un peu bizarre mais essentiel d'installer les plugins capacitor aussi bien dans le répertoire dédié à capacitor qu'à la racine du projet. En effet, les sources de l'application se trouvent à la racine du projet et il faut bien que la compilation puisse accéder aux plugins capacitor, sinon la compilation webpack échouera. D'un autre côté, si les plugins ne sont pas présents dans le répertoire de capacitor, c'est la compilation pour android qui ne produira pas une application fonctionnelle.

  • Editer le fichier quasar.config.js et trouver un champ boot. Modifier ce champ avec :
    boot: [
        'capacitor'
    ],
  •  Créer un fichier src/boot/capacitor.js avec dedans :
import { defineCustomElements } from '@ionic/pwa-elements/loader'

export default () => {
  defineCustomElements(window)
}
  •  Editer le fichier src/layouts/MainLayout.vue :
    • vers la fin du template :
    <q-page-container>
        <q-btn color="primary" label="Get Picture" @click="captureImage" />
        <img :src="imageSrc">     
      <router-view />
    </q-page-container>
    • au début de la partie <script>, ajouter les imports :
import { Camera, CameraResultType } from '@capacitor/camera'
    •  modifier la fonction setup() comme suivant :
  setup () {
    const leftDrawerOpen = ref(false)
    const imageSrc = ref('')

    async function captureImage () {
      const image = await Camera.getPhoto({
        quality: 90,
        allowEditing: true,
        resultType: CameraResultType.Uri
      })

      // The result will vary on the value of the resultType option.
      // CameraResultType.Uri - Get the result from image.webPath
      // CameraResultType.Base64 - Get the result from image.base64String
      // CameraResultType.DataUrl - Get the result from image.dataUrl
      imageSrc.value = image.webPath
    }
    
    return {
      essentialLinks: linksList,
      leftDrawerOpen,
      toggleLeftDrawer () {
        leftDrawerOpen.value = !leftDrawerOpen.value
      },
      imageSrc,
      captureImage,
    }
  }
  • Pour tester en mode application web : quasar dev
  • Normalement, quand on clique sur le bouton, un widget apparaît pour prendre une photo, si l'ordinateur possède une caméra. Sinon, il propose d'aller chercher une photo sur le disque.
  • Pour tester sur un simulateur de mobile android : quasar dev -m capacitor -T android