De nombreuses technos permettent d'obtenir des applications mobiles (apk sur les stores). Lesquelles ?
Natif Android, Natif iOS
Flutter, React native
Cordova, Capacitor
On va distinguer 4 familles de solutions:
Natif, Semi-natif, Compilé, Full Hybride
Android : Java/Kotlin (AAC, Retrofit, Room)
iOS : Objective C/Swift (Moya/Realm)
React Native: logique en React, mais appelle l'UI native Android/iOS
Unity: moteur de jeu (C# + framework dédié), compilé vers Android,iOS...
Flutter: code en Dart, compilé vers Android, iOS (et Linux + Web depuis 2.0)
Anciennement Cordova, maintenant Capacitor: application JS qui envoie des messages à des plugins natifs.
Capacitor génère des projets XCode / AndroidStudio / Electron à partir d'une webapp. Ces projets sont natifs, ils se buildent et se configurent comme des projets natifs (e.g. AndroidManifest.xml, build.gradle...)
Le projet généré est une "Super WebView" qui va embarquer la webapp et fournir des API js pour appeler des plugins natifs (GPS, bluetooth, vibreur...)
Le crédo de Capacitor : "Write once, run Everywhere”
Ecrivez votre webapp comme d'habitude (Angular/React/Vue/Js pur), puis ensuite:
npm install @capacitor/core @capacitor/cli
Installe les libraires Capacitor ainsi que la CLI (npx cap *
) dans votre webapp existante
npx cap init
Crée un fichier capacitor.config.json
Crée un fichier capacitor.config.json
{
"appId": "org.univ.compostmap",
"appName": "compostmap",
"bundledWebRuntime": false,
"npmClient": "npm",
"webDir": "dist",
"plugins": {
"SplashScreen": {
"launchShowDuration": 0
}
},
"cordova": {}
}
webdir
indique où capacitor doit aller chercher notre webapp buildée et minifiée.
Comment obtenir une version buildée et minifiée ?
npm run build
Dans notre cas, webdir = dist
npx cap add android
Génére un vrai projet Android qu'on peut ouvrir avec android studio
npx cap add ios
npx cap add electron
Idem pour ios et desktop (electron)
npx cap open android
Ouvre le projet avec Android Studio
On peut lancer/builder le projet comme un projet Android classique
On retrouve notre bon vieux manifest (les permissions c'est toujours là que ça se passe)
Unique activité MainActivity
, la "super WebView" (on reviendra dessus)
Notre webapp Vue (dossier dist) est embarquée dans les assets
Notre webapp Vue (dossier dist) est embarquée dans les assets
Et donc l'application est directement disponible offline grâce à notre travail sur le client-side routing (vue-router)
Bien sûr il faudra gérer le offline pour la partie REST (avec des DB dans le localstorage comme Dexie ou plus proprement avec des ServiceWorkers)
Pour mettre à jour l'application mobile quand on fait un changement dans la webapp :
npm run build
puis
npx cap copy
Avec Capacitor 3 également possible de faire du Live reload
Il est possible d'automatiser le npx cap copy
et la création de l'APK signé dans la CI (exemple gitlab Android)
L'APK signé est directement publiable sur le PlayStore (il faut un compte payant, je peux prêter le mien)
La philosophie de capacitor: du JS (Vue/React/Angular) partout où on peut
Du natif où c'est vraiment nécessaire. Des exemples ?
Haptics (vibreur), Accéléromètre, Appareil photo, Réalité augmentée...
Pour le natif, Capacitor repose sur la notion de plugin.
Chaque plugin va définir des API en JS. La "super webview" Capacitor va envoyer des évènements en JS pour interragir avec le code natif de la plateforme sur laquelle il est lancé.
Une version native du plugin, répondant à ces APIs, va être implémentée pour chaque plateforme (e.g. BarCode avec ZXSING sur Android et AVFoundation sur iOS).
Exemple : appareil photo (avec permissions)
Exemple : position GPS (avec permissions)
Usage plus complexe : Universal Linking
Permet à l'application d'intercepter certaines URL (e.g.
http://compostmap.fr/compost/33
), de se lancer et d'afficher un écran en fonction
Des dizaines de plugins officiels et communautaires sont disponibles. Capacitor ne couvrira peut être pas encore tous vos besoins...
Mais il est possible de créer vos propres plugins assez facilement (nécessite de savoir faire du natif).
Le module nous a permis de nous initier:
Au développement Android Natif (pour creuser: Kotlin, Android Architecture Components)
Au développement de SPA en VueJS (pour creuser: events, Webpack, SCSS/LESS, Dexie, Service Workers, VueX)
Au développement hybride avec Capacitor (pour creuser: Universal Links, création de plugins, Flutter!)
Merci beaucoup d'avoir été présents et attentif !
Après l'examen je vous enverrais un questionnaire sur le cours, merci de le remplir pour les étudiants de l'année prochaine
- Ma porte reste ouverte (par mail et/ou sur discoord et/ou sur twitter)