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.
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>
);
}
});
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.
UIBackgroundModes
devrait être mis à audio
(cochez la case docs pour plus d'informations)
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
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.
dans votre photo de L'Info.plist, il permet seulement trois modes d'arrière-plan:
- fetch en arrière-plan
- mise à jour des localisations
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".