Fermer

mai 18, 2020

Comment créer une application mobile dans Expo et Firebase (pour iOS et Android)

À propos de l’auteur

Chafik Gharbi est un ingénieur et développeur passionné d’applications mobiles et Web intéressé par tout ce qui touche au JavaScript et aux solutions multiplateformes.
En savoir plus sur
Chafik

Dans cet article, basé sur mon expérience de la création d’une application GPS et de navigation, je vais vous montrer comment créer une application mobile en utilisant les services Expo et Firebase tels que Firestore, les fonctions Firebase et les notifications push Expo. [19659004] Peut-être avez-vous entendu parler de React, le framework JavaScript développé par Facebook, ou avez-vous déjà travaillé avec lui? La société de médias sociaux est allée encore plus loin en lançant React Native, qui est rapidement devenu le cadre le plus populaire pour la création d’applications mobiles avec JavaScript. De nombreuses entreprises ont adopté l’idée et ont commencé à créer leurs applications avec elle.

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 ou notification 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 sur 0 sous la touche met à 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.

 Stockage du jeton push Expo
Données à stocker pour les demandes de notification push suivantes. ( Grand aperçu )

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 .

[19659017] const admin = require (« firebase-admin »);
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 et postMessage 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 instance WebView . Veuillez vous référer à la documentation MDN pour Window.postMessage () pour plus de détails sur les implications de sécurité de ceci.

Documentation React Native

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.

 Éditorial fracassant (ra, yk, il, al)

Source link