with socket realtime real react node error create app ios reactjs websocket socket.io react-native

realtime - ¿Cómo ejecutar socket.io en segundo plano en iOS en una aplicación React Native?



socket io socket io js (4)

En su imagen de la lista de información, solo permite los siguientes tres modos de fondo :

  1. Búsqueda de fondo
  2. Actualizaciones de ubicación
  3. Notificaciones remotas

    Debes permitir el modo "Audio y AirPlay" y parece que "La aplicación reproduce audio o transmite audio / video usando Airplay".

Estoy usando socket.io en una aplicación iOS React Native(v0.20) app . La aplicación rastrea mi ubicación, y cuando mi posición cambia, emite un mensaje a un servidor. Si la conexión de socket se pierde, el servidor envía un correo electrónico para notificarme.

Tengo el seguimiento de ubicación trabajando en segundo plano con react-native-location , pero no puedo hacer que socket.io funcione. Cuando cambio de aplicación o apago la pantalla, la aplicación sigue el seguimiento de mi ubicación pero pierdo la conexión de socket.

¿Hay alguna forma de ejecutar socket.io en segundo plano como el seguimiento de ubicación? Aparte de eso, ¿hay algún código nativo que me permita mantener una client/server connection mientras estoy en segundo plano?

Sé que hay una alternativa de WebSocket pero no puedo ver una forma de ejecutarlo en segundo plano.

ACTUALIZACIÓN: Info.plist mi Info.plist , ya tiene establecidos los valores de fondo necesarios para react-native-location . No sé si importa, pero el trabajo de socket y el seguimiento de ubicación se realizan en el mismo componente.

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


No hay manera de hacer esto "de la manera correcta".

Editar

De la documentación oficial de Apple:

Implementando tareas de larga ejecución

Para las tareas que requieren más tiempo de ejecución para implementar, debe solicitar permisos específicos para ejecutarlos en segundo plano sin que se suspendan. En iOS, solo los tipos de aplicaciones específicas pueden ejecutarse en segundo plano:

Aplicaciones que reproducen contenido audible para el usuario mientras está en segundo plano, como una aplicación de reproductor de música

Aplicaciones que graban contenido de audio mientras se encuentra en segundo plano.

Aplicaciones que mantienen a los usuarios informados de su ubicación en todo momento, como una aplicación de navegación

Aplicaciones compatibles con el protocolo de voz sobre Internet (VoIP)

Aplicaciones que necesitan descargar y procesar contenido nuevo regularmente.

Aplicaciones que reciben actualizaciones periódicas de accesorios externos.

Las aplicaciones que implementan estos servicios deben declarar los servicios que admiten y utilizar marcos de sistema para implementar los aspectos relevantes de esos servicios. La declaración de los servicios le permite al sistema saber qué servicios utiliza, pero en algunos casos son los marcos del sistema los que realmente impiden que su aplicación sea suspendida.

Dicho esto, existe una técnica de trabajo para mantener el zócalo abierto:

Reproduce un sonido silencioso y configura el modo de fondo como audio. Consulte este artículo para obtener más información al respecto (es un poco antiguo pero sigue siendo válido). Esto te permitirá mantener tu socket abierto falsificando una aplicación de audio. Su info.plist debe actualizarse para permitir que el audio se ejecute en segundo plano. UIBackgroundModes debe configurarse en audio (consulte los documentos para obtener más información)


Sé que hay trucos para hacer esto (es decir, el truco de audio ), pero hay una razón por la que iOS no permite realizar tareas de larga duración en segundo plano; replantee su diseño para permitir un mejor producto.

El uso de tareas de registro ejecutará agotará la batería. Si necesita actualizaciones de datos, regístrese para recibir notificaciones mediante el servicio push de Apple (es gratis, si lo hace directamente o si fue la última vez que traté un problema similar).

El seguimiento de ubicación, específicamente, es un servicio de sistema en segundo plano permitido, considere usar la API nativa para esto.

En cuanto a enviar los datos al servidor, no podrá (y probablemente no debería) mantener una conexión duradera con el servidor.

Considere la posibilidad de recopilar datos y cargar en el servidor el lote recopilado de vez en cuando, preferiblemente cuando se vuelva a abrir la aplicación, para que no desperdicie recursos en segundo plano y haga que la gente se moleste por la duración de la batería y el consumo de datos.


iOS es bastante restrictivo en cuanto al tipo de procesos que permite cuando una aplicación está en segundo plano .

Parece que hay algo de discusión sobre esto en el rastreador de problemas del cliente socket.io.

Parece que alguien consiguió que la conexión del zócalo se mantuviera activa si configuraban el modo de fondo como audio . YMMV

Asegúrese de que está configurando los valores correctos en la sección UIBackgroundModes del archivo Info.plist. Cómo hacer esto en XCode