wake-up-neo.net

Wie kann ich socket.io im Hintergrund unter iOS in einer React Native-App ausführen?

Ich verwende socket.io in einer iOS React Native(v0.20) app. Die App verfolgt meinen Standort und wenn sich meine Position ändert, sendet sie eine Nachricht an einen Server. Wenn die Socket-Verbindung unterbrochen wird, sendet der Server eine E-Mail, um mich zu benachrichtigen. 

Ich habe das Standort-Tracking im Hintergrund mit reag-native-location , aber ich kann socket.io nicht zum Laufen bringen. Immer wenn ich Apps ändere oder den Bildschirm ausschalte, verfolgt die App weiterhin meinen Standort, aber ich verliere die Socket-Verbindung.

Gibt es eine Möglichkeit, socket.io im Hintergrund auszuführen, z. B. Standortverfolgung? Kurz gesagt, gibt es einen nativen Code, der es mir erlaubt, im Hintergrund einen client/server connection zu verwalten?

Ich weiß, dass es eine WebSocket-Alternative gibt , aber ich sehe keine Möglichkeit, dass es im Hintergrund ausgeführt wird.

UPDATE: Ich habe meinen Info.plist überprüft, die erforderlichen Hintergrundwerte sind bereits für reag-native-location festgelegt. Ich weiß nicht, ob es wichtig ist, aber die Socket-Arbeit und die Standortverfolgung werden in derselben Komponente durchgeführt.

 enter image description here

LocationComponent.js

window.navigator.userAgent = 'react-native';
const io = require('socket.io-client/socket.io');
const socket = io(url, {jsonp: false});

import React, { Text, View, DeviceEventEmitter } from 'react-native';
import { RNLocation } from 'NativeModules';

export default GeolocationExample = React.createClass({

  componentDidMount: function() {
    RNLocation.requestAlwaysAuthorization();
    RNLocation.startUpdatingLocation();
    RNLocation.setDistanceFilter(3.0);
    DeviceEventEmitter.addListener('locationUpdated', locationObject => {
      this.props.newPosition({ longitude: locationObject.coords.longitude, latitude: locationObject.coords.latitude });
    });
  },

  render: function() {
    const { lastPosition, distance } = this.props;
    socket.emit('newPos', { longitude: lastPosition.longitude, latitude: lastPosition.latitude, distance, time: Date() });
    return (
      <View>
        <Text> {distance} </Text>
      </View>
    );
  }
});
19
EasilyBaffled

Es gibt keine Möglichkeit, dies "auf die richtige Art" zu tun.

Bearbeiten

Aus Apples offizieller Dokumentation :

Langfristige Aufgaben implementieren

Für Tasks, für die mehr Ausführungszeit erforderlich ist, müssen Sie fordern Sie bestimmte Berechtigungen an, um sie im Hintergrund ohne .__ auszuführen. sie werden suspendiert. In iOS dürfen nur bestimmte App-Typen im Hintergrund laufen:

Apps, die im Hintergrund hörbare Inhalte für den Benutzer wiedergeben, wie eine Musik-Player-App 

Apps, die Audioinhalte aufnehmen, während sie sich im .__ befinden. Hintergrund 

Apps, die Benutzer über ihren Standort informieren mal wie eine Navigations-App 

Apps, die Voice over Internet Protocol (VoIP) unterstützen 

Apps, die regelmäßig neue Inhalte herunterladen und verarbeiten müssen

Apps, die regelmäßig Updates von externem Zubehör erhalten

Apps, die diese Dienste implementieren, müssen die Dienste, die sie Unterstützung und Nutzung von System-Frameworks zur Implementierung der relevanten Aspekte von diese Dienstleistungen. Durch die Deklaration der Dienste weiß das System, welche Dienste, die Sie verwenden, aber in einigen Fällen sind es die System-Frameworks, die tatsächlich verhindern, dass Ihre Anwendung ausgesetzt wird.

Davon abgesehen gibt es eine Arbeitstechnik, um Ihre Steckdose offen zu halten: 

Geben Sie einen stummen Ton wieder und stellen Sie den Hintergrundmodus auf Audio. Überprüfen Sie diesen Artikel , um weitere Informationen zur Angelegenheit zu erhalten (etwas alt, aber immer noch gültig). Auf diese Weise können Sie Ihre Steckdose offen halten und eine Audio-App vorspielen. Ihre info.plist sollte aktualisiert werden, damit Audio im Hintergrund laufen kann .UIBackgroundModessollte auf audio gesetzt werden (weitere Informationen finden Sie in docs )

3
G. Hamaide

iOS ist ziemlich einschränkend für die Art von Prozessen, die es erlaubt, wenn eine App im Hintergrund ist

Auf dem socket.io client issue tracker scheint es einige Diskussionen zu geben.

Es scheint, dass jemand die Socket-Verbindung hat, aktiv zu bleiben, wenn er den Hintergrundmodus auf audio setzt. YMMV

Stellen Sie sicher, dass Sie die richtigen Werte im Abschnitt UIBackgroundModes der Datei Info.plist festlegen. Wie mache ich das in XCode

1
frank

Ich weiß, dass es Hacks gibt, um dies zu erledigen (d. H. Den audio-Hack), aber es gibt einen Grund, warum iOS keine langen Aufgaben im Hintergrund zulässt - bitte überdenken Sie Ihr Design, um ein besseres Produkt zu ermöglichen.

Durch die Verwendung von Protokolltasks wird die Batterie erschöpft. Wenn Sie Datenaktualisierungen benötigen, registrieren Sie sich, um Push-Benachrichtigungen über den Apple Push-Dienst zu erhalten (es ist kostenlos, wenn Sie es direkt tun oder es war das letzte Mal, dass ich ein ähnliches Problem behandelte).

Die Standortverfolgung ist insbesondere ein zulässiger Hintergrundsystemdienst. Verwenden Sie dazu die native API.

Beim Übertragen der Daten auf den Server können (und sollten Sie wahrscheinlich nicht) eine dauerhafte Verbindung zum Server aufrechterhalten werden.

Erwägen Sie gegebenenfalls das Sammeln von Daten und das Hochladen des gesammelten Stapels auf den Server - am besten, wenn die App erneut geöffnet wird. So verschwenden Sie keine Ressourcen im Hintergrund und verärgern die Benutzer über ihre Akkulaufzeit und ihren Datenverbrauch.

1
Myst

In Ihrem Bild der Info.plist sind nur die folgenden drei background-Modi erlaubt:

  1. Hintergrund holen 
  2. Standortaktualisierungen
  3. Remote-Benachrichtigungen

    Sie sollten den "Audio and AirPlay" -Modus zulassen, und es scheint, als "App spielt Audio oder Streams Audio/Video mit Airplay".

0
waynezhu