Geo-Tracking in React Native

Eine mobile Anwendung kann als „Arbeitsplatz“ eines Mitarbeiters fungieren, während möglicherweise geografische Koordinaten und andere Daten übertragen werden müssen. Bei der plattformübergreifenden Anwendungsentwicklung unter iOS und Android werden häufig Frameworks wie Flutter oder React Native für diese Aufgabe verwendet. In diesem Artikel sprechen wir am Beispiel unseres Falls über die Funktionen der Arbeit mit der Geolokalisierung in React Native.



Die Zuverlässigkeit, Geschwindigkeit und Reife von React Native werden manchmal von Entwicklern kritisiert, und vor etwa drei Jahren konnten solche Zweifel als berechtigt bezeichnet werden. In dieser Zeit wurde die Technologie jedoch weiterentwickelt, und React Native wurde als praktisches Werkzeug zur Erstellung einer Vielzahl von Anwendungen anerkannt. React Native eignet sich insbesondere für Anwendungen, die geografische Koordinaten verwenden, z. B. verschiedene Tracker, Anwendungen für Kuriere usw.

Die von React Native entwickelten Online-Shop-Anwendungen, Restaurantmenüs, Newsfeeds, Lieferanwendungen und Social-Media-Clients sind auch in den Stores beliebt. Daher wird eine große Menge von React Native ständig verwendet, ohne darüber nachzudenken. Einfache Beispiele sind Facebook, Instagram, Skype, Uber Eats, Wallmart. Prognosen zufolge kann Microsoft diese Liste auffüllen und seine mobilen Anwendungen an React Native übertragen, insbesondere nachdem die Unterstützung für die Windows-Plattform implementiert wurde. Es gibt React Native-Unterstützung für Qt- , macOS- und "integrierte" Weechat- Anwendungen , obwohl die Unterstützung und Dokumentation für diese Plattformen eher rar ist.

React Native kann fast alles genauso machen wie eine native Anwendung. Empfangen Sie beispielsweise Informationen von Gerätesensoren, wie dies bei Java / Kotlin- oder ObjC / Swift-Anwendungen der Fall ist, oder senden Sie Daten im Hintergrund mithilfe des Vordergrunddienstes oder des Hintergrundabrufs. Der einzige Unterschied besteht darin, dass Sie in React Native eine Schnittstelle für die Interaktion zwischen dem nativen Teil und Javascript implementieren müssen. Für alltägliche Aufgaben sind diese Schnittstellen häufig bereits implementiert. Dies gilt auch für die Verfolgung des Speicherorts und des Betriebs von Javascript im Hintergrund: Es gibt bereits Lösungen in Form unabhängiger Open Source-Bibliotheken. So kam es, dass die Community Javascript unabhängig nach vorne „zieht“. Sowohl Programmierer als auch Unternehmen nutzen aktiv Open Source-Lösungen. Nur wenige Sprachgemeinschaften verfügen über die gleiche Anzahl von Bibliotheken, Frameworks,Qualitätsdienstprogramme. In React Native sind jedoch einige Funktionen, die in der nativen Entwicklung vorhanden sind, immer noch begrenzt, und dies sollte beachtet werden.

Arbeiten Sie mit React Native


Berücksichtigen Sie mehrere Schlüsselfaktoren, die die Entwicklungsgeschwindigkeit plattformübergreifender Anwendungen in React Native sicherstellen:

Gemeinsame Codebasis


Sobald die Logik geschrieben ist, funktionieren Layoutbildschirme und Komponenten auf verschiedenen Plattformen und sehen so gut wie möglich aus (z. B. verwenden sie unter Android anstelle der üblichen Schatten den Begriff der Hochstimmung). Für Entwickler mit alten Versionen gibt es praktisch keine ewigen Kopfschmerzen. Beispielsweise ist es einfach, Unterstützung auch für Android 4.4 hinzuzufügen, obwohl die Implementierung dieser Aufgabe in der Praxis auch von der Verwendung zusätzlicher nativer Module abhängt.

Optimaler Workflow


Oft bietet React einen optimalen Workflow, der die Entwicklung neuer Funktionen um ein Vielfaches schneller macht als in Muttersprachen. Dies gilt für Layout, Komponentenansatz, Abhängigkeitsinstallation und allgemeine Architekturlösungen für React.

Hot Reload


Der Entwickler muss die Anwendung nicht jedes Mal neu erstellen, um die Änderungen zu sehen. Dank Hot Reload dauert es nur ein paar Sekunden, um die Anwendung auf den aktuellen Status zu aktualisieren. In Version 0.61 wurde zusätzlich an Live Reload (jetzt Fast Refresh) erinnert. Beim Bearbeiten des Schriftsatzes werden Änderungen sofort übernommen, ohne dass der aktuelle Status der Komponenten zurückgesetzt wird.

Bei der Erstellung einer Anwendung müssen einige Schlüsselbereiche besonders berücksichtigt werden:

1) Javascript

React Native zielt darauf ab, mit Javascript zu arbeiten, sodass Sie die Logik und die Schnittstellen schnell beschreiben können. Es gibt viele vorgefertigte Module aus der Welt von Web und Node.js, die auf die übliche Weise verwendet werden können (natürlich, wenn sie nicht mit dem DOM oder der Serverseite verbunden sind). Trotz seiner hohen Geschwindigkeit ist Javascript Muttersprachen manchmal unterlegen. Es gibt kein Multithreading. In React Native können wir nicht direkt auf die Native-API zugreifen, obwohl diese Einschränkung möglicherweise bald aufgehoben wird. Javascript beschreibt hauptsächlich, was im nativen Teil getan und gerendert werden muss.

2) Brücke

Ein Bus, der Javascript-Aufrufe über spezielle Schnittstellen akzeptiert, die von der reaktionsnativen Bibliothek bereitgestellt werden. Anrufe sind reguläre serialisierte Nachrichten. Für jede Komponente - eine einfache Ansicht, ein Eingabefeld oder ein Aufruf des Systemdialogs - gibt es eine in Javascript beschriebene Schnittstelle mit der im nativen Teil implementierten Logik. Der Bus ist der langsamste Teil, er ist asynchron, das Übertragen von Daten zwischen Javascript und dem Native braucht Zeit (höchstwahrscheinlich kann Facebook ihn vollständig entfernen ). Häufig werden die Leistungsprobleme von Anwendungen in React Native genau durch den Betrieb der Bridge verursacht. Wenn Sie sie jedoch korrekt verwenden (reduzieren Sie die Datenübertragung auf das erforderliche Minimum), unterscheidet sich die Leistung in React Native-Anwendungen nicht wesentlich.

3) Der native Teil

Eine Anwendung auf React Native ist zunächst eine normale native Anwendung. Die Besonderheit ist, dass alle erforderlichen Bibliotheken bereits darin verbunden sind, sodass Sie die gesamte Logik in React JS schreiben können. Hier können wir unsere eigene native Logik schreiben, um sie in JS zu verwenden (oder nicht zu verwenden), die üblichen nativen Bibliotheken hinzufügen (z. B. um TLS v1.2 unter KitKat und früher zu unterstützen). In vorgefertigten nativen Anwendungen können Sie Unterstützung für React Native hinzufügen.

Arbeiten mit Geo-Tracking in React Native


In einem der Projekte mussten wir einen „mobilen Arbeitsplatz“ für die Mitarbeiter unserer Kunden entwickeln, um insbesondere die Übertragung ihrer geografischen Koordinaten im Hintergrund sicherzustellen.

In React Native gibt es verschiedene Tools für die Arbeit mit der Geolokalisierung. Dies ist beispielsweise ein Paket aus der React Native @ React-Native -Community / Geolocation-Community , das die meisten Anwendungsfälle abdeckt, jedoch nicht im Hintergrund funktioniert.

Um unsere Aufgabe zu implementieren, haben wir verschiedene Lösungen verwendet, einschließlich einer Bibliothek mit dem sprechenden Namen @ mauron85 / react-native-background-geolocation. Ursprünglich war diese Bibliothek ein Plugin für Cordova, aber später trennte der Autor die Basis und erstellte separate Wrapper für React Native. Es gibt auch eine gleichnamige kostenpflichtige Bibliothek von transistorsoft, die zum Zeitpunkt unserer Arbeit an dem Projekt jedoch nur mit ihrer Dokumentation gewonnen hat.

In der Bibliothek konnten wir flexible Einstellungen für die Standortverfolgung vornehmen. Zum Beispiel, mit welcher Häufigkeit ein Systemdienst abgefragt werden soll, wie genau im Hintergrund gearbeitet werden soll, in welchem ​​Radius die Position als bewegungslos betrachtet wird. Einstellungen und Methoden zum Senden dieser Koordinaten an den Server könnten "out of the box" verwendet werden. Wir haben uns jedoch entschieden, keine Spam-Anfragen zu stellen, sondern die empfangenen Koordinaten im Repository zu aggregieren und mit einem großen Intervall zu senden. Gleichzeitig ermöglichte uns die Bibliothek, unsere Anwendung als foregroundActivity zu starten, wodurch unnötige Kopfschmerzen vermieden wurden, da auf vielen Android-Geräten Anwendungen im Hintergrund nur mit zusätzlichen Einstellungen funktionieren können ( Huawei, MIUI, Samsung kürzlich ).

Nach der Installation können Sie eine Komponente oder nur einen Helfer erstellen, der den Dienst verwaltet. Wir haben uns entschlossen, die Komponente zu verwenden, um sie unter den Bedingungen im Router zu montieren und einfach mit Redux zu verbinden. Richten Sie unseren Service ein:

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();
};


Wir sehen, dass Sie hier auch Einstellungen für die Benachrichtigung festlegen können, ein Symbol (aus nativen Assets). Was ist mit Berechtigungen? Für Android ist nach der Installation des Pakets nichts erforderlich. Die Bibliothek übernimmt die Anforderungen für den Zugriff auf die Geolokalisierung des Systems. Für den normalen Betrieb unter iOS in Xcode müssen Sie jedoch auch die Hintergrundverarbeitung und Standortaktualisierungen auf der Registerkarte Signieren und Funktionen des Projekts aktivieren.



Wir implementieren die Hauptmethode zum Speichern und Senden von Koordinaten im Ereignis on ('location') in derselben Methode. Es funktioniert sowohl mit der aktiven Anwendung als auch im minimierten Zustand:

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);  //   !
    });
});


Hier rufen wir die Aktion aus dem Speicher auf, wo wir die Koordinatendaten in einem benutzerdefinierten Format übertragen und zusätzlich Daten zu den Batteriemesswerten mithilfe der Bibliothek mit reaktionsnativen Geräteinformationen speichern. All dies funktioniert unter Android und iOS gleich gut, wenn die Anwendung aktiv ist oder im Hintergrund.

Darüber hinaus gibt es Methoden zum Abrufen des aktuellen Speicherorts (dies funktioniert jedoch nur, wenn der Dienst ausgeführt wird), zum Abonnieren von Übergängen des Anwendungsstatus vom aktiven zum Hintergrund und zum Wechseln zu den Systemeinstellungen der Anwendung. Im Großen und Ganzen ist in diesen Beispielen jedoch das Notwendigste angegeben.

Das Ergebnis ist eine Komponente, die beispielsweise nur für das autorisierte Teil montiert werden kann:

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

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

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

	render() {
    return null;
  }
} 


Wenn React-Navigation verwendet wird, können Sie die Navigation für das autorisierte Teil wie folgt erstellen:

//  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;


Außerdem kann dieser Navigator im Root-Navigator auf die übliche Weise verwendet werden:

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

export default createAppContainer(RootNavigator);


Daher funktioniert der Geolokalisierungs- und Datenaustauschdienst nur im autorisierten Teil der Anwendung.

Zusammenfassen


In diesem Artikel haben wir die Funktionen der Verwendung von React Native in Geolocation-Anwendungen untersucht. Wie wir herausgefunden haben, können Entwickler mithilfe dieses Frameworks jetzt problemlos die geografischen Koordinaten des Geräts verfolgen - beispielsweise in Fahrrad-Trackern, Anwendungen für Kuriere und Spediteure, Anwendungen für die Auswahl von Immobilien usw. Die Bibliothek deckt die meisten Fälle im Zusammenhang mit Geotracking ab. Insbesondere können Sie die Intervalle anpassen und die Ladung des Geräts sparen. Sie funktioniert auf beiden Plattformen stabil im Hintergrund und unterstützt Autorun unter Android. Gleichzeitig ist für komplexe Anwendungen in der Regel die native Entwicklung besser geeignet (z. B. für die Arbeit mit Berechnungen und Widgets, wie wir bereits im vorherigen Artikel geschrieben haben).

Vielen Dank für Ihre Aufmerksamkeit, wir hoffen, dass der Artikel für Sie nützlich war!

All Articles