Comment faire pour exécuter socket.io en arrière-plan sur iOS dans une Réagir application Native?

j'utilise socket.io dans un iOS React Native(v0.20) app. L'application suit mon emplacement, et quand ma position change, elle émet un message vers un serveur. Si la connexion socket est perdue, le serveur envoie un e-mail pour me prévenir.

j'ai la localisation qui fonctionne en arrière-plan avec réagissent-native-lieu, mais je ne peux pas obtenir socket.io au travail. Chaque fois que je change d'application ou que j'éteins l'écran, l'application continue de suivre mon emplacement, mais je perds la connexion socket.

Est il y a un moyen d'exécuter socket.io en arrière-plan comme le suivi de localisation ? A défaut, il y a un code natif qui me permettra de maintenir un client/server connection en arrière plan?

je sais qu'il est un WebSocket alternative mais je ne vois pas un moyen de le faire fonctionner en arrière-plan.

mise à jour: J'ai doublé vérifié mon Info.plist, il a déjà les valeurs de fond nécessaires pour réagissent-native-lieu. Je ne sais pas si c'est important, mais le travail sur les sockets et le suivi des emplacements sont effectués dans le même composant.

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>
    );
  }
});
18
demandé sur Bindi 2016-02-17 16:50:45

4 réponses

il n'y a aucun moyen que vous puissiez faire cela "de la bonne façon".

Modifier

From Apple documents officiels:

Mise En Œuvre De Tâches De Longue Durée

pour les tâches nécessitant plus de temps d'exécution à mettre en œuvre, vous devez demander des permissions spécifiques pour les exécuter en arrière-plan sans leur suspension. Dans iOS, seuls les types d'applications spécifiques sont autorisés à exécuter en arrière-plan:

les applications qui diffusent du contenu audible à l'utilisateur en arrière-plan, comme une application lecteur de musique

les applications qui enregistrent du contenu audio arrière-plan

des applications qui tiennent les utilisateurs informés de leur localisation fois, comme une application de navigation

Applications qui prennent en charge la Voix sur Protocole Internet (VoIP)

applications qui ont besoin de télécharger et de traiter de nouveaux contenus régulièrement

Applications qui reçoivent mises à jour régulières des accessoires externes

les applications qui implémentent ces services doivent déclarer les services qu'elles soutenir et utiliser les cadres de système pour mettre en œuvre les aspects pertinents de la ces services. La déclaration des services permet au système de savoir les services que vous utilisez, mais dans certains cas c'est le système de cadres empêchez en fait votre application d'être suspendue.

ceci étant dit, il existe une technique de travail pour garder votre socket ouvert :

jouer un son silencieux et régler le mode d'arrière-plan sur audio. Vérifier cet article pour plus d'informations sur le sujet (c'est un peu vieux mais toujours valable). Cela vous permettra de garder votre socket ouvert feindre une application audio. Votre info.plist doit être mis à jour pour permettre l'audio en arrière-plan. UIBackgroundModesdevrait être mis à audio(cochez la case docs pour plus d'informations)

3
répondu G. Hamaide 2016-03-01 10:17:05

iOS est assez restrictif sur le type de processus qu'il permet quand une application est backgrounded.

Il semble y avoir une discussion à ce sujet sur le socket.io client problème de tracker.

il semble que quelqu'un ait obtenu la connexion socket pour rester actif s'ils ont mis le mode arrière-plan à audio. YMMV

assurez-vous que vous définissez les valeurs correctes dans la section UIBackgroundModes de L'Info.dossier plist. Comment faire ce dans XCode

1
répondu frank 2017-05-23 10:31:12

je sais, il existe des astuces pour y arriver (c'est à dire l' audio hack), mais il y a une raison pour laquelle iOS ne permet pas les tâches de longue durée en arrière - plan-veuillez repenser votre conception pour permettre un meilleur produit.

L'utilisation de tâches d'exécution de journal va épuiser la batterie. Si vous avez besoin de mises à jour de données, inscrivez-vous pour obtenir des notifications push en utilisant le service push D'Apple (c'est gratuit, si vous le faites directement, ou c'était la dernière fois que j'ai traité d'un problème similaire).

Localisation, plus précisément, est un service de système d'arrière-plan autorisé, envisager d'utiliser L'API native pour cela.

pour ce qui est de pousser les données vers le serveur, vous ne pourrez pas (et ne devriez probablement pas) maintenir une connexion de longue durée avec le serveur.

envisager de collecter des données et de télécharger sur le serveur le lot collecté de temps en temps - de préférence lorsque l'application est réouverte, de sorte que vous ne gaspillez pas les ressources à l'arrière-plan et d'obtenir les gens fâchés au sujet de leur vie de batterie et la consommation de données.

1
répondu Myst 2016-03-07 04:53:13

dans votre photo de L'Info.plist, il permet seulement trois modes d'arrière-plan:

  1. fetch en arrière-plan
  2. mise à jour des localisations
  3. notification à distance

    vous devriez autoriser le mode " Audio and AirPlay "et il semble comme"L'application lit l'audio ou les flux audio/vidéo en utilisant Airplay".

0
répondu waynezhu 2016-02-26 10:17:24