Comment créer une application mobile dans Expo et Firebase (pour iOS et Android)
Dans cet article, nous allons avoir une idée de la façon de développer une application pour Android et iOS en utilisant Expo et Firebase, basée sur ma propre expérience de création d’une application avec ces technologies. Si vous n’avez jamais travaillé avec Firebase auparavant, veuillez consulter son guide des projets JavaScript avant de plonger.
Si vous êtes nouveau sur JavaScript, assurez-vous que vous êtes clair sur les bases d’ECMAScript 6 fonctionnalités, telles que l’importation de classe et les fonctions fléchées. Vous pouvez apprendre React Native à partir de la documentation officielle qui contient une section sur les principes fondamentaux de React au cas où vous n’auriez pas travaillé avec React. Ne vous inquiétez pas de la façon de créer une application avec Android Studio ou Xcode, car nous utiliserons le cadre Expo .
Lecture recommandée sur SmashingMag:
Brève description du projet [19659002] Nous pouvons décrire notre projet comme un transporteur à la demande – vous pourriez dire Uber pour le transport de marchandises. L’utilisateur choisira les informations de transport, telles que le type de véhicule et les emplacements de chargement et de déchargement, puis les véhicules de transport à proximité apparaîtront sur la carte. L’utilisateur confirme sa demande et les conducteurs reçoivent les notifications une par une. La notification de chaque conducteur est active pendant 25 secondes. S’ils ignorent ou refusent la demande, le système sélectionne un autre pilote, etc. Lorsqu’un conducteur accepte la demande, l’utilisateur peut surveiller l’ensemble du processus de transport sur la carte, y compris via l’application Web.
Installation et configuration d’Expo
Tout d’abord, nous devons installer l’interface de ligne de commande (CLI) pour Expo , qui nous aidera à tester l’application dans un simulateur ou sur des appareils réels et à construire notre application dans le cloud.
npm install -g expo-cli
Créons notre projet Expo.
expo init [19659013] La partie intéressante est que toutes les configurations de votre application peuvent être effectuées dans un seul fichier JSON, app.json
. Voici quelques conseils que j'ai appris qui pourraient augmenter vos chances d'être acceptés dans l'App Store et Google Play et pour vous aider à éviter certains problèmes courants.
- Si vous utilisez Google Maps dans votre application, assurez-vous de fournir l’API dans le fichier de configuration
app.json
afin de le faire fonctionner correctement. Google ne vous facturera pas le rendu de carte natif à moins que vous ne rendiez un itinéraire ou que vous n’utilisiez d’autres services d’API payants.... "ios": { ... "config": { "googleMapsApiKey": "YOUR_API_KEY" } }, "Android": { ... "config": { "Google Maps": { "apiKey": "YOUR_API_KEY" } } }
- Pour effectuer des mises à jour d’emplacement ou toute autre tâche en arrière-plan, travailler en arrière-plan dans iOS, ajoutez les clés suivantes sous
ios.infoPlist
:... "ios": { ... "infoPlist": { ... "UIBackgroundModes": [ "location", "fetch" ] } }
- Si vous ne définissez pas les autorisations que votre application utilisera, l’application générée par Expo utilisera par défaut toutes les autorisations disponibles. Par conséquent, Google Play rejettera votre application. Donc, spécifiez vos autorisations requises.
... "Android": { ... "autorisations": [...], }
- Apple vous demande de fournir un message expliquant à l’utilisateur pourquoi l’application demande cet accès, sinon vous serez rejeté.
... "ios": { ... "infoPlist": { ... "NSCameraUsageDescription": "Pourquoi demandez-vous l'accès à la caméra de l'appareil?", "NSLocationWhenInUseUsageDescription": "Pourquoi demandez-vous l'accès à la caméra de l'appareil?" } }
- Assurez-vous d’incrémenter la clé
android.versionCode
avant de publier une nouvelle version sur Google Play. - Toutes les mises à jour peuvent être effectuées avec Expo par liaison radio, sans passer par Google Play ou le App Store, sauf si vous apportez les modifications suivantes:
- mettez à niveau la version d’Expo SDK;
- modifiez quoi que ce soit sous
ios
android
ounotification
touches; - modifiez les éclaboussures de l’application
- modifiez l’icône de l’application
- modifiez le nom de l’application
- modifiez les paramètres de l’application
propriétaire
; - modifiez le schéma de l’application
- modifiez
facebookScheme
; - modifiez vos actifs groupés sous
assetBundlePatterns
- Je préfère ne pas interpréter l’expérience utilisateur en définissant
fallbackToCacheTimeout
sur0
sous la touchemet à jour
. Cela permettra à votre application de démarrer immédiatement avec un ensemble mis en cache, tout en téléchargeant un plus récent en arrière-plan pour une utilisation future.
Et voici un exemple complet de la configuration dans app.json
:
{
"expo": {
"nom": "Transportili",
"slug": "transportili",
"schéma": "transportili",
"vie privée": "public",
"sdkVersion": "36.0.0",
"notification": {
"icon": "./assets/notification-icon.png",
"androidMode": "par défaut"
},
"plates-formes": [
"ios",
"android",
"web"
],
"version": "0.3.2",
"orientation": "portrait",
"icon": "./assets/icon.png",
"éclaboussure": {
"image": "./assets/splash.png",
"resizeMode": "contient",
"backgroundColor": "#ffffff"
},
"mises à jour": {
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
"bundleIdentifier": "com.transportili.driver",
"supportsTablet": faux,
"infoPlist": {
"UIBackgroundModes": [
"location",
"fetch"
],
"LSApplicationQueriesSchemes": [
"transportili"
],
"NSCameraUsageDescription": "L’application utilise l’appareil photo pour prendre une photo ou numériser vos documents.",
"NSLocationWhenInUseUsageDescription": "L’application utilise votre position pour aider les chauffeurs ou les transporteurs à vous trouver sur la carte."
},
"config": {
"googleMapsApiKey": "AIzaSyA8Wcik6dTuxBKolLSm5ONBvXNz8Z0T-6c"
}
},
"Android": {
"googleServicesFile": "./google-services.json",
"package": "com.transportili.driver",
"versionCode": 6,
"autorisations": [
"ACCESS_COARSE_LOCATION",
"ACCESS_FINE_LOCATION"
],
"config": {
"Google Maps": {
"apiKey": "AIzaSyA8Wcik6dTuxBKolLSm5ONBvXNz8Z0T-6c"
}
}
},
"la description": "",
"githubUrl": "https://github.com/chafikgharbi/transportili-native.git"
}
}
Passons à l’installation de Firebase, en utilisant la commande suivante:
expo install firebase
Je préfère créer un fichier firebase.js
dans le dossier racine de l’application qui contient toutes les configurations Firebase. Dans ce cas, j’utilise uniquement les services Firestore et Storage.
const firebaseConfig = {
apiKey: "api-key",
authDomain: "project-id.firebaseapp.com",
databaseURL: "https://project-id.firebaseio.com",
projectId: "project-id",
storageBucket: "project-id.appspot.com",
messagingSenderId: "sender-id",
appId: "app-id",
mesureId: "G-mesure-id"
};
Maintenant, chaque fois que nous voulons utiliser Firebase, nous importons simplement ce fichier, comme suit:
import {firebase, firestore, storage} from "./firebase";;19659013 diplomatedThe documentation has une explication plus détaillée de utilisant Firebase avec Expo .
La base de données de l’application
Vous pouvez stocker vos données directement dans le cloud à l’aide de Firebase, qui propose deux types de bases de données. L’une est la base de données en temps réel et l’autre est Firestore, qui est considérée comme la version améliorée de la base de données en temps réel, avec des fonctionnalités plus avancées. Les deux sont des bases de données NoSQL avec écouteurs de synchronisation des données et de changements instantanés. Ils ont différents mécanismes: la base de données en temps réel stocke les données en tant qu’objet JSON, tandis que Firestore stocke les données en tant que documents dans des collections. Ils calculent également l’utilisation et le coût différemment: le premier est basé sur la quantité de données échangées et le second est basé sur le nombre d’opérations dans les documents (lectures, écritures et suppressions).
Dans mon cas, j’ai utilisé la base de données Firestore pour stocker les utilisateurs, les demandes, les véhicules et d’autres données d’application. (J’essayais d’être intelligent en mettant toutes mes données dans un document pour réduire l’utilisation des opérations, mais j’ai découvert que chaque document ne pouvait stocker que 1 Mo.)
En plus de stocker des chaînes, des nombres, des objets, etc. dans Firebase, vous pouvez également stocker un geoPoint, qui est un objet qui contient les coordonnées des points géographiques (latitude et longitude). Malgré cela, malheureusement, vous ne pouvez pas effectuer de requêtes géographiques, telles que la récupération d’utilisateurs à proximité.
Pour ce faire, nous pouvons utiliser GeoFirestore. Mais nous devons tenir compte du fait que ce package restreint la structure du document de l’utilisateur à ceci:
Utilisateur: {
d: {toutes les données utilisateur ici}
g: (emplacement geohash)
l: {premier emplacement géopoint}
}
Donc, si vous allez l’implémenter directement dans votre collection d’utilisateurs, comme je l’ai fait, vous devrez mettre toutes les données de l’utilisateur dans la clé d
.
Enfin, n’oubliez pas d’optimiser votre code pour éviter des opérations inattendues:
- Utilisez la persistance hors ligne. Sur le Web, la persistance hors ligne est désactivée; assurez-vous de l’activer.
- Utilisez la pagination du curseur dans les requêtes Firestore. N’obtenez pas toutes les données en même temps.
- Désabonnez toujours les écouteurs, une fois terminés, ou les composants non montés.
Le back-end de l’application
Vous pouvez gérer la base de données Firestore, envoyer des notifications avec Expo et effectuer certaines opérations directement depuis le frontend ou l’application mobile, mais il y a d’autres opérations que nous ne pouvons pas faire sans backend et serveur. C’est pourquoi Firebase propose des fonctions – un back-end cloud qui vous permet d’exécuter du code Node.js sur un serveur évolutif. J’ai utilisé les fonctions Firebase pour les éléments suivants:
- Envoyer des notifications (voir l’exemple ci-dessous)
Pour envoyer des notifications, nous utiliserons les notifications push, un outil qui aide le propriétaire d’une application à envoyer des messages à ses utilisateurs. Il apparaît dans la section des notifications de l’appareil, même si l’application n’est pas active. Nous ne voulons pas que ce processus soit interrompu par une interruption soudaine de la connectivité, nous devrons donc utiliser un serveur. - Exécuter des tâches cron
L’utilisation des tâches cron m’aide à gérer les demandes et notifications planifiées . - Désinfection de la base de données
Cela inclut la suppression des demandes inutiles et ignorées. - Exécution de tâches sensibles, coûteuses ou continues
Cela inclut l’enregistrement, la récupération des utilisateurs et la planification des commandes. Ce sont toutes des opérations sensibles. Si vous les créez directement à partir de votre application ou de votre frontal, il y a un risque de vulnérabilité de sécurité et de tâches interrompues.
L’article de Joaquin Cid « Comment créer une API basée sur les rôles avec l’authentification Firebase » donnera vous explique comment démarrer avec les fonctions Firebase et comment créer une API principale à l’aide d’Express. Il utilise TypeScript, mais la conversion de TypeScript en JavaScript n’est pas difficile.
Notifications push
Expo envoie une notification au périphérique de l’utilisateur à partir de ses serveurs. Il identifie l’appareil de l’utilisateur avec un jeton. Lorsque quelqu’un utilise l’application, l’application exécute du code pour obtenir le jeton de l’appareil, puis stocke ce jeton sur le serveur. J’ai utilisé Firestore comme d’habitude pour stocker le jeton et comparer les jetons entrants pour vérifier si l’utilisateur s’est connecté à partir d’un autre appareil.

Nous obtenons notre jeton en utilisant la fonction suivante:
token = attendent Notifications.getExpoPushTokenAsync ();
N’oubliez pas de demander la permission de pousser les notifications . La documentation a un exemple d’utilisation .
Chaque fois que vous voulez envoyer une notification à cet utilisateur, vous feriez une demande au serveur d’Expo, qui contient le jeton d’appareil de l’utilisateur déjà stocké sur votre serveur.
curl -H "Content-Type: application / json" -X POST "https://exp.host/--/api/v2/push/send" -d '{"to": " ExponentPushToken [xxxxxxxxxxxxxxxxxxxxxx] "," title ":" hello "," body ":" world "} '
Voici un exemple simple qui envoie des notifications à tous les utilisateurs utilisant les fonctions Firebase. Cet exemple n’est pas sécurisé. Si vous souhaitez implémenter l’autorisation et l’authentification, veuillez suivre l’article de Cid mentionné ci-dessus.
Après avoir initialisé notre projet à l’aide de la CLI Firebase installons le framework Express pour gérer notre API.
npm install express
Nous devons prendre en charge CORS et ajouter un middleware analyseur de corps JSON. De cette façon, nous pouvons effectuer des requêtes à partir de n’importe quelle URL et analyser les requêtes au format JSON.
npm install --save cors body-parser
npm install --save-dev @ types / cors
Il s’agit du fichier principal index.js
de notre répertoire
de fonctions
:
const express = besoin ("express");
const cors = require ("cors");
const bodyParser = require ("body-parser");
const admin = require ("firebase-admin");
fonctions const = require ("firebase-functions");
// Initialise le module SDK admin de firebase
admin.initializeApp (functions.config (). firebase);
// Définir l'application Express
const app = express ();
app.use (bodyParser.json ());
app.use (cors ({origin: true}));
// Gérer la demande de notifications push
app.post ("/ pushNotifications", require ("./ controllers / pushNotifications"));
// Gérer une autre demande
// app.post ("/ anotherRoute", require ("./ controllers / anotherController"));
// Exporte l'API de point de terminaison https gérée par l'application Express
export const api = functions.https.onRequest (app);
Et voici le contrôleur pushNotifications.js
situé dans le dossier contrôleurs
.
const axios = require (« axios »);
const chunkArray = require (« ./ chunkArray »);
const firestore = admin.firestore ();fonction async pushNotifications (req, res) {
essayez {
const data = req.body;
// Obtenez des utilisateurs de Firestore, puis créez un tableau de notifications
attendre sapin
.collection (« utilisateurs »). get ()
.then ((querySnapshot) => {
if (querySnapshot.size) {
// Ce tableau contiendra la notification de chaque utilisateur
laissez notificationsArray = [];
querySnapshot.forEach ((doc) => {
laissez docData = doc.data ();
if (docData && docData.d) {
let userData = docData.d;
// Le pushNotificationsToken récupéré de l’application et stocké dans Firestore
if (userData.pushNotificationsToken) {
notificationsArray.push ({
à: userData.pushNotificationsToken,
…Les données,
});
}
}
});
// Envoie des notifications à 100 utilisateurs à la fois (le nombre maximum qu’une seule requête Expo prend en charge)
laissez notificationsChunks = chunkArray (notificationsArray, 100);
notificationsChunks.map ((chunk) => {
axios ({
méthode: « post »,
url: « https://exp.host/–/api/v2/push/send »,
données: morceau,
en-têtes: {
« Content-Type »: « application / json »,
},
});
});
return res.status (200) .send ({message: « Notifications envoyées! »});
} autre {
return res.status (404) .send ({message: « Aucun utilisateur trouvé »});
}
})
.catch ((erreur) => {
retour res
.status (500)
.send ({message: `$ {error.code} – $ {error.message}`});
});
} catch (erreur) {
retour res
.status (500)
.send ({message: `$ {error.code} – $ {error.message}`});
}
}
module.exports = pushNotifications;
Dans le contrôleur ci-dessus, nous avons obtenu tous les utilisateurs de l’application de Firestore. Chaque utilisateur a un jeton push. Nous avons divisé cette liste en ensembles de 100 utilisateurs, car une seule demande à Expo ne peut contenir que 100 notifications. Ensuite, nous avons envoyé ces notifications à l’aide d’Axios.
Voici la fonction chunkArray
:
function chunkArray (myArray, chunk_size) {
indice var = 0;
var arrayLength = myArray.length;
var tempArray = [];
for (index = 0; index
Ceci est un exemple de la façon d’envoyer des notifications via notre API à l’aide d’Axios.
axios ({
méthode: "post",
url: "https: //...cloudfunctions.net/api/pushNotifications",
Les données: {
title: "Titre de notification",
body: "organisme de notification",
},
});
Cartes et géolocalisation
Rendu natif de Google Maps dans React Native
Pour afficher Google Maps dans l’application mobile, j’ai utilisé react-native-maps
et pour rendre les directions, J’ai utilisé le paquet react-native-maps-directions
. Pour une application Web, j’utiliserais du JavaScript pur.
npm install react-native-maps react-native-maps-directions
Ensuite, importez ces packages:
importez MapView, { Marqueur, PROVIDER_GOOGLE} de "react-native-maps";
importer MapViewDirections à partir de "react-native-maps-directions";
Nous rendrons la carte avec des marqueurs et des directions:
(mapView = ref)}
// Pour de meilleures performances, évitez d'utiliser la carte par défaut sur iOS
provider = {PROVIDER_GOOGLE}
// Affiche le point bleu qui représente l'emplacement actuel sur la carte
showsUserLocation = {true}
initialRegion = {{
... this.state.currentLocation,
latitudeDelta: LATITUDE_DELTA,
longitudeDelta: LONGITUDE_DELTA,
}}
/ *
* Regarder le changement de région lorsque l'utilisateur déplace la carte
* par exemple, pour obtenir l'adresse avec géocodage inversé.
* /
onRegionChangeComplete = {(region) => {
console.log (
`Centre de la carte: latitude: $ {region.latitude} $ {region.latitude}
longitude: $ {region.latitude} $ {region.longitude} `
);
}}
// Rembourrage des bords de la carte
mapPadding = {{
haut: 20,
à droite: 20,
en bas: 20,
gauche: 20,
}}
>
{/ * Marqueur de rendu avec icône personnalisée * /}
{this.state.marker && (
)}
{/ * Rendre plusieurs marqueurs * /}
{this.state.markers.map ((marqueur, index) => {
revenir (
);
})}
{/ * Rendu des directions à partir d'un tableau de points * /}
{this.state.directions.length> = 2 && (
2
? this.state.directions.slice (1, -1)
: nul
}
OptimizeWaypoints = {true}
apikey = {GOOGLE_MAPS_APIKEY}
strokeWidth = {5}
strokeColor = "green"
onReady = {(résultat) => {
console.log (
`Distance" $ {result.distance} km "," $ {result.duration} min "`
);
}}
onError = {(errorMessage) => {
console.log (errorMessage);
}}
/>
)}
Regarder l’emplacement de l’utilisateur au premier plan et en arrière-plan
Le cadre d’Expo prend en charge les mises à jour de l’emplacement en arrière-plan. Je souhaite utiliser cette fonction pour obtenir la position de l’utilisateur. Même si l’application n’est pas au premier plan ou si le téléphone est verrouillé, l’application doit toujours envoyer l’emplacement au serveur.
import * comme emplacement depuis "expo-location";
importer * en tant que TaskManager depuis "expo-task-manager";
importer geohash depuis "ngeohash";
importer {firebase, firestore} depuis "../firebase";
laissez USER_ID = null;
laissez LOCATION_TASK = "background-location";
laissez updateLocation = (location) => {
si (USER_ID) {
firestore
.collection ("utilisateurs")
.doc (USER_ID)
.mise à jour({
"d.location": nouveau firebase.firestore.GeoPoint (
location.latitude,
location.longitude
),
g: geohash.encode (location.latitude, location.longitude, 10),
l: nouveau firebase.firestore.GeoPoint (
location.latitude,
location.longitude
),
});
}
};
TaskManager.defineTask (LOCATION_TASK, ({data, error}) => {
si (erreur) {
// Une erreur s'est produite - consultez `error.message` pour plus de détails.
revenir;
}
if (données) {
const {locations} = données;
// Position actuelle avec latitude et longitude
currentLocation = {
latitude: emplacements [0] .coords.latitude,
longitude: emplacements [0] .coords.longitude,
};
updateLocation (currentLocation);
}
});
exporter la fonction asynchrone par défaut watchPosition (userid) {
// Définir l'ID utilisateur
USER_ID = id_utilisateur;
// Demander des autorisations pour utiliser le GPS
const {status} = attendre Location.requestPermissionsAsync ();
si (statut === "accordé") {
// regarder la position en arrière-plan
attendre Location.startLocationUpdatesAsync (LOCATION_TASK, {
précision: Location.Accuracy.BestForNavigation,
distanceIntervalle: 10,
showsBackgroundLocationIndicator: true,
foregroundService: {
notificationTitle: "Titre",
notificationBody: "Explication",
notificationColor: "# FF650D",
},
});
// Regarder la position au premier plan
attendre Location.watchPositionAsync (
{
précision: Location.Accuracy.BestForNavigation,
distanceIntervalle: 10,
},
(emplacement) => {
laissez currentLocation = {
latitude: location.coords.latitude,
longitude: location.coords.longitude,
};
updateLocation (currentLocation);
}
);
} autre {
// Autorisation de localisation refusée
}
}
Si vous le remarquez, j’ai utilisé différentes structures lors de la mise à jour de l’emplacement vers Firestore. C’est parce que j’utilise le package GeoFirestore pour interroger les utilisateurs à proximité.
Utilisation de WebView dans React Native
L’application n’est pas seulement destinée aux utilisateurs mobiles, mais également aux utilisateurs de bureau. Donc, ne perdons pas de temps à développer une autre application qui partage une grande partie des mêmes fonctionnalités, telles que la connexion et l’enregistrement, les profils et les paramètres, et l’historique des commandes.
Sur le site Web de l’application, nous vérifions si l’utilisateur provient d’un navigateur de bureau ou l’application mobile. Nous les redirigeons ensuite vers l’application correspondante.
Pour une application mobile, nous devons implémenter une sorte de communication entre l’application native et l’application WebView, grâce à l’injection JavaScript de postMessage
et onMessage
dans WebView. Mais faites attention quand et comment vous l’utilisez:
Avertissement de sécurité: Actuellement,
onMessage
etpostMessage
ne permettent pas de spécifier une origine. Cela peut entraîner des attaques de script intersite si un document inattendu est chargé dans une instanceWebView
. Veuillez vous référer à la documentation MDN pourWindow.postMessage ()
pour plus de détails sur les implications de sécurité de ceci.
Nous enverrons les données de JavaScript Web à React Native. Voici un exemple d’envoi d’un ID utilisateur:
window.ReactNativeWebView.postMessage (
JSON.stringify ({
action: "setUserID",
données: user.uid
})
);
Nous écouterons les données provenant du Web dans WebView.
(webview = référence)}
onMessage = {(événement) => {
let message = JSON.parse (event.nativeEvent.data);
switch (message.action) {
case "setUserID":
laissez id = message.data;
Pause;
cas "anotherAction":
//
Pause;
}
}}
/>;
Envoyons les données de React Native vers le Web. L’exemple suivant envoie un emplacement récupéré depuis React Native.
let location = JSON.stringify ({latitude: 36.742022, longitude: 3.103771});
webview.injectJavaScript (`
window.injectData ({
action: "setLocation",
données: JSON.stringify ($ {location})
})
`);
Nous lirons l’emplacement sur le Web:
window.injectData = (message) => {
switch (message.action) {
case "setLocation":
let location = JSON.parse (message.data);
Pause;
cas "anotherAction":
//
Pause;
}
};
L’application Web et le site Web
Toutes les parties liées au Web, du site Web à l’application Web, ont été créées avec Next.js et hébergées sur Netlify pour trois raisons principales:
- coût- efficacité
Il n’y a pas de serveur à entretenir, et le plan gratuit de Netlify est plus que suffisant pour mes besoins. Les référentiels privés illimités sont désormais gratuits sur GitHub, donc ne vous inquiétez plus. - développement sans effort
Validez, poussez et laissez Netlify faire le reste. - speed
Les sites Web sont statiques et tous hébergés sur un réseau de diffusion de contenu (CDN). Lorsqu’un utilisateur demande ces sites Web, le CDN les dirige vers la copie la plus proche afin de minimiser la latence. Ainsi, les sites Web sont extrêmement rapides.
Limitations d’Expo
Il existe deux approches pour créer une application avec Expo: le flux de travail géré, où vous écrivez uniquement JavaScript, et les outils et services Expo font le reste pour vous, et le workflow nu, où vous avez un contrôle total sur tous les aspects du projet natif, et où les outils Expo ne peuvent pas aider autant. Si vous prévoyez de suivre la première approche, tenez compte des limitations d’Expo car certaines fonctionnalités qui existent dans les principales applications, telles que Spotify (par exemple, la musique jouant en arrière-plan) et Messenger (notifications d’appel), ne peuvent pas
Conclusion
Expo est un excellent choix si vous n’êtes pas familier avec le développement natif et que vous souhaitez éviter tous les maux de tête associés à la création et au déploiement régulier d’une application. Firebase peut vous faire économiser beaucoup de temps et de travail, en raison de son évolutivité et de sa variété de services. Cependant, les deux sont des services tiers, sur lesquels vous n’avez aucun contrôle, et Firestore n’est pas conçu pour les requêtes complexes et les relations de données.
Merci de votre attention. J’espère que vous avez apprécié cet article et appris quelque chose de nouveau.
