Ionic est un framework web. Grâce à Capacitor, vous pouvez accéder à des fonctionnalités 100% natives :
👉 Capacitor agit comme un pont entre votre code JavaScript/Vue et les API Android / iOS.
Les plugins vus en cours ne sont qu’une sélection.
Il existe aussi des plugins “Community” (créés par la communauté).
Certains plugins nécessitent des configurations supplémentaires dans :
➡️ Toujours lire la doc officielle du plugin utilisé : https://capacitorjs.com/docs/plugins
Capacitor permet à une application Ionic de :
Rôle de Capacitor : faire le lien entre :
| Feature | Cordova | Capacitor |
|---|---|---|
| Architecture | Ancienne | Moderne |
| Plugins | Nombreux mais vieillissants | Officiels + support TypeScript |
| Intégration web | Moyenne | Excellente |
| Maintenance | Faible | Très active |
| Web-first | ❌ | ✔️ |
👉 Conclusion : Capacitor est aujourd’hui l’outil recommandé pour les apps Ionic.
À la création d’un projet Ionic-Vue :
ionic start my-app blank --type=vue --capacitor
--capacitor ajoute Capacitor dès le départ
Génère automatiquement :
Après création / ajout de Capacitor :
my-app/
├─ android/ # Projet Android natif (Kotlin/Java)
├─ ios/ # Projet iOS natif (Swift)
├─ src/ # Votre app Vue/Ionic
├─ capacitor.config.ts # Config Capacitor
└─ package.json
Synchroniser et ouvrir les projets natifs :
ionic cap sync
ionic cap open android
ionic cap open ios
ionic cap run android --livereload
Installer un plugin (ex. caméra) :
npm install @capacitor/camera
➡️ Vérifier la doc officielle pour chaque plugin.
src/…)ionic build
ionic cap sync
ionic cap open android # ou ios
En pratique :
- 90% du temps :
ionic serve(dev UI)- ponctuellement : build + tests sur émulateur / téléphone pour les APIs natives
L’API Camera permet de :
prendre une photo
choisir une photo dans la galerie
récupérer l’image en :
Cas d’usage :
<template>
<ion-page>
<ion-header>
<ion-toolbar>
<ion-title>Caméra</ion-title>
</ion-toolbar>
</ion-header>
<ion-content class="ion-padding">
<ion-button expand="block" @click="takePhoto">
Prendre une photo
</ion-button>
<img v-if="photo" :src="photo" class="preview" />
</ion-content>
</ion-page>
</template>
<script setup lang="ts">
import { Camera, CameraResultType, CameraSource } from '@capacitor/camera'
import { ref } from 'vue'
const photo = ref<string | null>(null)
async function takePhoto() {
const img = await Camera.getPhoto({
quality: 70,
resultType: CameraResultType.Uri,
source: CameraSource.Camera
})
photo.value = img.webPath ?? null
}
</script>
<style>
.preview {
width: 100%;
margin-top: 16px;
border-radius: 12px;
}
</style>
Sur Android :
AndroidManifest
Sur iOS :
➜ ajouter des descriptions dans Info.plist :
NSCameraUsageDescriptionNSPhotoLibraryUsageDescriptioniOS affiche ce texte dans le popup de demande d’autorisation.
L’API Filesystem permet :
Cas d’usage :
import { Filesystem, Directory, Encoding } from '@capacitor/filesystem'
await Filesystem.writeFile({
path: 'note.txt',
data: 'Hello world!',
directory: Directory.Documents,
encoding: Encoding.UTF8
})
const result = await Filesystem.readFile({
path: 'note.txt',
directory: Directory.Documents
})
console.log(result.data)
Dans un navigateur :
Sur mobile (Android / iOS) :
accès à des répertoires natifs :
persistance plus “profonde” côté OS
Stockage simple clé → valeur, idéal pour :
import { Preferences } from '@capacitor/preferences'
// Sauvegarde
await Preferences.set({
key: 'theme',
value: 'dark'
})
// Lecture
const res = await Preferences.get({ key: 'theme' })
console.log(res.value)
Fonctionnellement proche de
localStorage, mais avec une API asynchrone et un stockage natif.
Permet de :
savoir si l’utilisateur est en ligne ou non
écouter les changements de réseau :
Très utile pour :
import { Network } from '@capacitor/network'
const status = await Network.getStatus()
console.log('Connected ?', status.connected)
// status.connectionType → wifi, cellular, none, unknown…
import { Network } from '@capacitor/network'
Network.addListener('networkStatusChange', status => {
console.log('Network status:', status.connected)
})
Cas d’usage :
syncPendingActions() quand status.connected === true
L’API Haptics permet :
Idéal pour :
import { Haptics, ImpactStyle } from '@capacitor/haptics'
await Haptics.impact({ style: ImpactStyle.Medium })
Autres méthodes :
Haptics.vibrate({ duration })Haptics.selectionStart()Haptics.selectionChanged()Très utile pour rendre l’UI plus “vivante” sur mobile.
L’API Share permet d’ouvrir la feuille de partage native :
Cas d’usage :
import { Share } from '@capacitor/share'
await Share.share({
title: 'Ma note',
text: 'Voici une note importante.',
url: 'https://example.com'
})
Capacitor se charge d’ouvrir l’UI de partage appropriée.
Certaines APIs ne fonctionnent pas en Web (navigateur).
Exemples :
👉 Il faut parfois tester la plateforme avant d’appeler un plugin.
import { Capacitor } from '@capacitor/core'
const isNative = Capacitor.isNativePlatform()
console.log(isNative) // true = Android/iOS, false = Web
const platform = Capacitor.getPlatform()
console.log(platform) // 'ios', 'android', 'web', 'electron'
Cas d’usage :
import { Capacitor } from '@capacitor/core'
import { Camera, CameraResultType } from '@capacitor/camera'
if (!Capacitor.isNativePlatform()) {
// Fallback navigateur
document.querySelector('#fileInput')?.click()
} else {
const image = await Camera.getPhoto({
resultType: CameraResultType.Uri
})
}
Idée : sur Web, on utilise un
<input type="file">à la place.
import { Capacitor } from '@capacitor/core'
const isAvailable = Capacitor.isPluginAvailable('Camera')
if (!isAvailable) {
// Proposer une alternative
} else {
const image = await Camera.getPhoto({
resultType: CameraResultType.Uri
})
}
Permet d’éviter les erreurs si un plugin n’est pas supporté sur une plateforme.
🎯 Objectif : créer une page pour tester plusieurs APIs natives.
Dans une nouvelle page :
Ajouter 4 boutons :
Afficher les résultats dans l’UI :
<ion-button expand="block" @click="takePhoto">
Caméra
</ion-button>
<ion-button expand="block" @click="vibrate">
Haptique
</ion-button>
<ion-button expand="block" @click="checkNetwork">
Réseau
</ion-button>
<ion-button expand="block" @click="savePref">
Préférences
</ion-button>
Bonus : ajoutez des ion-toast pour afficher les messages de résultat.
Si vous ne pouvez pas déployer sur un téléphone :
Caméra :
<input type="file"> en fallback si !Capacitor.isNativePlatform()
Haptics :
Réseau :
Network.getStatus() fonctionne aussi en WebPréférences :
Preferences fonctionne en Web → vérifier après refresh🎯 But : la page doit fonctionner sans erreur :
ionic serve)Capacitor = pont entre Ionic et les API natives
Plugins principaux vus :
Nécessité de :
ionic cap sync)💡 Retenir : vous pouvez faire beaucoup de choses “comme une vraie app native”, tout en restant en Ionic-Vue + TypeScript.