Géolocalisation dans React Native

Une application mobile peut agir comme le «lieu de travail» d'un employé, alors qu'il peut être nécessaire de transférer des coordonnées géographiques et d'autres données. Dans le développement d'applications multiplateforme sur iOS et Android, des frameworks tels que Flutter ou React Native sont souvent utilisés pour cette tâche. Dans cet article, nous parlons des fonctionnalités de la géolocalisation dans React Native en utilisant l'exemple de notre cas.



La fiabilité, la rapidité et la maturité de React Native sont parfois critiquées par les développeurs, et il y a environ trois ans, de tels doutes pouvaient être considérés comme justifiés. Cependant, pendant ce temps, la technologie est devenue plus avancée et React Native a été reconnu comme un outil pratique pour créer un large éventail d'applications. En particulier, React Native convient aux applications qui utilisent des coordonnées géographiques - par exemple, divers trackers, applications pour les courriers, etc.

Aussi dans les magasins sont développés sur React Native les applications des magasins en ligne, les menus des restaurants, les flux d'actualités, les applications de livraison, les clients des réseaux sociaux - ainsi, un grand nombre de React Native utilisent constamment, sans même y penser. Des exemples simples sont Facebook, Instagram, Skype, Uber Eats, Wallmart. Selon les prévisions, Microsoft peut reconstituer cette liste et transférer ses applications mobiles vers React Native, en particulier après avoir mis en œuvre la prise en charge de la plate-forme Windows. Il existe une prise en charge React Native pour Qt , macOS , les applications weechat «intégrées» , bien que la prise en charge et la documentation de ces plateformes restent plutôt rares.

React Native peut presque tout faire la même chose qu'une application native. Par exemple, recevez des informations des capteurs de périphérique, comme le font les applications Java / Kotlin ou ObjC / Swift, ou envoyez des données en arrière-plan à l'aide du service de premier plan ou de la récupération en arrière-plan. La seule différence est que dans React Native, vous devez implémenter une interface pour l'interaction entre la partie native et Javascript. Pour les tâches quotidiennes, ces interfaces sont souvent déjà implémentées. Cela s'applique également au suivi de l'emplacement et du fonctionnement de Javascript en arrière-plan: il existe déjà des solutions sous forme de bibliothèques open source indépendantes. Il se trouve que la communauté "tire" Javascript de manière indépendante, les programmeurs et les entreprises utilisent activement les solutions Open Source. Peu de communautés linguistiques disposent du même nombre de bibliothèques, de cadres,services publics de qualité. Et pourtant, dans React Native, certaines fonctionnalités qui existent dans le développement natif sont encore limitées, et cela doit être rappelé.

Travailler avec React Native


Tenez compte de plusieurs facteurs clés qui garantissent la vitesse de développement d'applications multiplateformes sur React Native:

Base de code commune


Une fois la logique écrite, les écrans de mise en page et les composants sur différentes plates-formes fonctionnent et se ressemblent autant que possible (par exemple, sur Android, au lieu des ombres habituelles, ils utilisent la notion d'exaltation). Il n'y a pratiquement pas de casse-tête éternel pour un développeur avec d'anciennes versions - par exemple, il est facile d'ajouter un support même pour Android 4.4, bien qu'en pratique la mise en œuvre de cette tâche dépend également de l'utilisation de modules natifs supplémentaires.

Flux de travail optimal


Souvent, React fournit un flux de travail optimal qui rend le développement de nouvelles fonctionnalités plusieurs fois plus rapide que dans les langues natives. Cela s'applique à la mise en page, à l'approche des composants, à l'installation des dépendances, aux solutions architecturales courantes pour React.

Rechargement à chaud


Le développeur n'a pas besoin de reconstruire l'application à chaque fois pour voir les modifications. Grâce à Hot Reload, il suffit de quelques secondes pour mettre à jour l'application à l'état actuel. Et dans la version 0.61, Live Reload (maintenant c'est Fast Refresh) a également été évoqué, maintenant lorsque les modifications de composition sont tirées «à la volée», sans réinitialiser l'état actuel des composants.

Lors de la création d'une application, plusieurs domaines clés nécessitent une attention particulière:

1) Javascript

React Native vise à travailler avec Javascript, vous permettant de décrire rapidement la logique et les interfaces. Il existe de nombreux modules prêts à l'emploi du monde du Web et de Node.js qui peuvent être utilisés de la manière habituelle (naturellement, s'ils ne sont pas connectés avec le DOM ou avec le côté serveur). Malgré sa grande vitesse, Javascript est parfois inférieur aux langues natives. Il n'y a pas de multithreading. Dans React Native, nous ne pouvons pas accéder directement à l'API Native, bien que cette restriction puisse bientôt être supprimée. Javascript décrit principalement ce qui doit être fait et rendu dans la partie native.

2) Pont

Un bus qui accepte les appels Javascript via des interfaces spéciales fournies par la bibliothèque native de react. Les appels sont des messages sérialisés réguliers. Pour chaque composant - une simple vue, un champ de saisie ou un appel à la boîte de dialogue système - il existe une interface décrite en Javascript avec la logique implémentée dans la partie native. Le bus est la partie la plus lente, il est asynchrone, le transfert de données entre Javascript et le natif prend du temps (très probablement, Facebook peut s'en débarrasser complètement ). Souvent, les problèmes de performances des applications sur React Native sont causés précisément par le fonctionnement du pont, mais si vous l'utilisez correctement (réduisez le transfert de données dans les deux sens au minimum nécessaire), les performances des applications React Native ne différeront pas de manière significative.

3) La partie native

Une application sur React Native est initialement une application native ordinaire. La particularité est que toutes les bibliothèques nécessaires y sont déjà connectées afin que vous puissiez écrire toute la logique dans React JS. Ici, nous pouvons écrire notre propre logique native afin de l'utiliser (ou de ne pas l'utiliser) dans JS, ajouter des bibliothèques natives ordinaires (par exemple, pour prendre en charge TLS v1.2 sur KitKat et versions antérieures). Dans les applications natives prêtes à l'emploi, vous pouvez ajouter la prise en charge de React Native.

Utilisation du suivi géographique dans React Native


Dans l'un des projets, nous devions développer un «lieu de travail mobile» pour les employés de nos clients, notamment pour assurer le transfert de leurs coordonnées géographiques en arrière-plan.

Il existe plusieurs outils pour travailler avec la géolocalisation dans React Native. Par exemple, il s'agit d'un package de la communauté React Native @ react-native-community / geolocation , qui couvre la plupart des cas d' utilisation, mais ne fonctionne pas en arrière-plan.

Pour mettre en œuvre notre tâche, nous avons utilisé plusieurs solutions, dont une bibliothèque avec le nom parlant @ mauron85 / react-native-background-geolocation. Initialement, cette bibliothèque était un plugin pour Cordova, mais plus tard, l'auteur a séparé la base et créé des enveloppes distinctes pour React Native. Il existe également une bibliothèque payante du même nom de transistorsoft, mais au moment de nos travaux sur le projet, elle ne gagnait qu'avec sa documentation.

La bibliothèque nous a permis de définir des paramètres flexibles pour le suivi de l'emplacement. Par exemple, avec quelle fréquence interroger un service système, comment fonctionner exactement en arrière-plan, dans quel rayon la position sera considérée comme immobile. Les paramètres et les méthodes d'envoi de ces coordonnées au serveur pouvaient être utilisés «prêts à l'emploi», mais nous avons décidé de ne pas envoyer de demandes de spam, mais d'agréger les coordonnées reçues dans le référentiel et de les envoyer avec un grand intervalle. Dans le même temps, la bibliothèque nous a permis de lancer notre application en tant qu'activité de premier plan, nous évitant ainsi des maux de tête inutiles, car sur de nombreux appareils Android, les applications en arrière-plan ne peuvent fonctionner qu'avec des paramètres supplémentaires ( Huawei, MIUI, Samsung récemment ).

Après l'installation, vous pouvez créer un composant ou simplement un assistant qui gère le service. Nous avons décidé d'utiliser le composant pour le monter avec les conditions du routeur et le connecter facilement à redux. Mettre en place notre service:

import BackgroundGeolocation, {
  Location,
} from '@mauron85/react-native-background-geolocation';
 
class ForegroundService extends PureComponent<Props> {
//...
startBackgroundService = (config: GeotrackerConfig) => {
     //    
	BackgroundGeolocation.configure({
  	desiredAccuracy: BackgroundGeolocation.HIGH_ACCURACY,
  	stationaryRadius: 50,
  	distanceFilter: config.distance,
  	notificationTitle: Strings.Geolocation.NOTIFICATION_TITLE,
  	notificationText: Strings.Geolocation.NOTIFICATION_DESCRIPTION,
  	debug: false,
  	startOnBoot: false,
  	stopOnTerminate: true,
  	locationProvider: BackgroundGeolocation.ACTIVITY_PROVIDER,
  	interval: this.runnerInterval,
  	fastestInterval: 10000,
  	activitiesInterval: 30000,
  	stopOnStillActivity: false,
  	notificationIconColor: Colors.primary,
  	notificationIconSmall: 'notification_icon',
	});
 
     //    start()      
                    	BackgroundGeolocation.on('authorization', status => {
  	if (status !== BackgroundGeolocation.AUTHORIZED) {
    	//   
  	} else if (status.hasPermissions) {
        // hasPermission -  ,    
  	}
	});
 
     //  
                    	BackgroundGeolocation.start();
};


Nous voyons ici que vous pouvez également définir les paramètres de la notification, une icône (à partir des ressources natives). Et les autorisations? Pour Android, après l'installation du package, rien n'est requis, la bibliothèque prendra en charge les demandes d'accès à la géolocalisation du système. Mais pour un fonctionnement normal sur iOS dans Xcode, vous devez également activer le traitement en arrière-plan et les mises à jour d'emplacement dans l'onglet Signature et capacités du projet.



Nous implémentons la méthode principale pour enregistrer et envoyer des coordonnées dans l'événement on ('location') de la même méthode. Il fonctionnera à la fois avec l'application active et dans l'état réduit:

BackgroundGeolocation.on('location', location => {
    BackgroundGeolocation.startTask(async taskKey => {
     //       ,
     //     iOS-
      const batteryLevel = this.isSimulator
        ? 100
        : (await DeviceInfo.getBatteryLevel()) * 100;
      const updateDelta = location.time - this.lastUpdateAt;

     //      
      this.props.locationUpdate(location);
      this.props.locationAddTrackerData({
        altitude: location.altitude,
        batteryChargeLevel: batteryLevel,
        latitude: location.latitude,
        longitude: location.longitude,
        course: location.bearing,
        accuracy: location.accuracy,
        speed: location.speed,
        timestamp: Number(String(location.time).substr(0, 10)),
        isAlertOn: false,
      });

     //  ?
      if (updateDelta / 1000 > config.sendInterval) {
        this.syncDataWithInterval();
        this.lastUpdateAt = location.time;
      }

     //    AsyncStorage,    
      Storage.setLastKnownLocation(location);
      BackgroundGeolocation.endTask(taskKey);  //   !
    });
});


Ici, nous appelons action à partir du magasin, où nous transférons les données de coordonnées dans un format personnalisé, stockant en outre des données sur les lectures de la batterie, à l'aide de la bibliothèque React-Native-Device-Info. Tout cela fonctionne aussi bien sur Android et iOS lorsque l'application est active ou en arrière-plan.

De plus, il existe des méthodes pour obtenir l'emplacement actuel (mais cela ne fonctionne que lorsque le service est en cours d'exécution), en s'abonnant aux transitions de l'état de l'application de l'actif à l'arrière-plan, en passant aux paramètres système de l'application. Cependant, dans l'ensemble, le plus nécessaire est donné dans ces exemples.

Le résultat est un composant qui peut être monté, par exemple, uniquement pour la pièce autorisée:

class ForegroundService extends PureComponent<Props> {
	//...
	componentDidMount() {
		this.startBackgroundService(this.props.config);
	}

	componentWillUnmount() {
    BackgroundGeolocation.stop();
    BackgroundGeolocation.removeAllListeners();
  }

	startBackgroundService = (config: GeotrackerConfig) => {
    BackgroundGeolocation.configure({
		// ...
	};

	render() {
    return null;
  }
} 


Si react-navigation est utilisé, vous pouvez créer la navigation pour la pièce autorisée comme suit:

//  StackNavigator   
const Navigator = createStackNavigator(RouteConfigs, NavigatorConfig);


class AppNavigator extends PureComponent<Props> {
  static router: NavigationRouter = Navigator.router;

  componentDidMount(): void {
    SplashScreen && SplashScreen.hide();
  }

  render() {
    return (
      <>
        <ForegroundService navigation={this.props.navigation} />
        <Navigator {...this.props} />
      </>
    );
  }
}

export default AppNavigator;


De plus, ce navigateur peut être utilisé de la manière habituelle dans le navigateur racine:

const RootNavigator = createSwitchNavigator(
  {
    Auth: AuthNavigator,
    App: AppNavigator,
  },
  {
    initialRouteName: 'Auth',
  },
);

export default createAppContainer(RootNavigator);


Ainsi, le service de géolocalisation et d'échange de données ne fonctionnera que dans la partie autorisée de l'application.

Résumer


Dans cet article, nous avons examiné les fonctionnalités de l'utilisation de React Native dans les applications de géolocalisation. Comme nous l'avons découvert, à l'aide de ce cadre, les développeurs peuvent désormais facilement suivre les coordonnées géographiques de l'appareil - par exemple, dans les trackers de vélos, les applications pour les courriers et les transitaires, les applications pour le choix de l'immobilier, etc. La bibliothèque couvre la plupart des cas liés à la géolocalisation, en particulier, elle vous permet d'ajuster les intervalles et d'économiser l'énergie de l'appareil, elle fonctionne de manière stable en arrière-plan sur les deux plates-formes et prend en charge l'exécution automatique sur Android. Dans le même temps, pour les applications complexes, le développement natif est généralement plus adapté (par exemple, pour travailler avec des calculs et des widgets, comme nous l'avons déjà écrit dans l' article précédent ).

Merci de votre attention, nous espérons que l'article vous a été utile!

All Articles