2016-02-17 8 views
18

Sto usando socket.io in un iOS React Native(v0.20) app. L'app tiene traccia della mia posizione e, quando la mia posizione cambia, invia un messaggio a un server. Se la connessione socket è persa, il server invia un'email per notificarmi.Come eseguire socket.io in background su iOS in un'app React Native?

Ho il rilevamento della posizione in background con react-native-location, ma non riesco a far funzionare socket.io. Ogni volta che cambio app o spengo lo schermo, l'app tiene traccia della mia posizione ma perdo la connessione socket.

C'è un modo per eseguire socket.io in background come il rilevamento della posizione? A parte questo c'è un codice nativo che mi permetterà di mantenere uno client/server connection mentre è in background?

So che c'è uno WebSocket alternative ma non riesco a vedere un modo per farlo funzionare in background.

UPDATE: ho raddoppiato controllato il mio Info.plist, ha i valori di fondo necessari fissati già per react-native-location. Non so se è importante, ma il funzionamento del socket e il rilevamento della posizione vengono eseguiti nello stesso componente.

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

Il comportamento è simile su iOS e Android oppure si tratta di un problema solo per iOS? – Stavash

+0

Non ho provato Android. Questa è la mia prima app React Native e volevo concentrarmi sulla creazione di iOS in modo da poterlo utilizzare sul mio telefono. – EasilyBaffled

+0

Hai trovato una soluzione a questo? –

risposta

1

IOS è abbastanza restrittivo il tipo di processi permette when an app is backgrounded.

Sembra esserci qualche discussione su questo sul client socket.io issue tracker.

Sembra che qualcuno abbia mantenuto attiva la connessione socket se ha impostato la modalità background su audio. YMMV

Assicurarsi di impostare i valori corretti nella sezione UIBackgroundModes del file Info.plist. How to do this in XCode

+0

Avevo già impostato i valori in Info.plist per 'react-native-location', e come ho menzionato nella domanda, il tracciamento della posizione funziona. Ho aggiunto una foto dei valori di Info.plist alla domanda. – EasilyBaffled

2

Non c'è modo di fare questo "nel modo giusto".

Modifica

Da official documentation di Apple:

realizzazione di compiti di lungo corso

Per le attività che richiedono più tempo di esecuzione per attuare, è necessario richiesta autorizzazioni specifiche per eseguirli in lo sfondo senza lo loro sospesi.In iOS, tipi app solo specifici sono autorizzati a eseguire in background:

Apps che giocano contenuti udibile per l'utente mentre sullo sfondo, come ad esempio un lettore di musica app

applicazioni che registrare audio contenuti mentre in sfondo

applicazioni che mantengono gli utenti informati della loro posizione in ogni volte, come ad esempio un'applicazione di navigazione

applicazioni che supportano Voice over Internet Protocol (VoIP)

applicazioni che hanno bisogno di scaricare ed elaborare nuovi contenuti regolarmente

applicazioni che ricevono aggiornamenti regolari dagli accessori esterni

applicazioni che implementano questi servizi deve dichiarare i servizi che di supporto e di sistema uso quadri applicare la pertinente aspetti di tali servizi. La dichiarazione dei servizi consente al sistema di sapere quali servizi di si utilizzano, ma in alcuni casi sono le strutture di sistema che impediscono effettivamente la sospensione dell'applicazione.

Detto questo, esiste una tecnica di lavoro esistono per mantenere il vostro socket aperto:

Riproduci un suono silenzioso e impostare la modalità di sfondo per l'audio. Controlla this article per ulteriori informazioni sull'argomento (è un po 'vecchio ma ancora valido). Ciò ti consentirà di mantenere aperto il tuo socket simulando un'app audio. Il tuo info.plist dovrebbe essere aggiornato per consentire l'esecuzione dell'audio in background. UIBackgroundModes deve essere impostato a audio (controllare la docs per maggiori informazioni)

+0

Sono già in esecuzione controlli di posizione in background. Come ho mostrato, l'ho impostato nel file info.plist. Non dovrebbe già occuparsene? – EasilyBaffled

0

nella vostra immagine del Info.plist, permette solo le seguenti tre background modes:

  1. Sfondo fetch
  2. aggiornamenti Posizione
  3. Notifiche remote

    Si dovrebbe consentire la modalità "Audio e AirPlay" e sembra lik e "App riproduce audio o stream audio/video usando Airplay".

1

So che ci sono trucchi per ottenere questo fatto (vale a dire la audio Hack), ma c'è una ragione per iOS non consente lunghe compiti in esecuzione in background - si prega di ripensare la progettazione per consentire un prodotto migliore.

L'utilizzo delle attività di esecuzione del registro comporta l'esaurimento della batteria. Se hai bisogno di aggiornamenti dei dati, registrati per ricevere notifiche push usando il servizio push di Apple (è gratuito, se lo fai direttamente, o è stata l'ultima volta che ho affrontato un problema simile).

Il rilevamento della posizione, in particolare, è un servizio di sistema in background consentito, considerare l'utilizzo dell'API nativa per questo.

Per quanto riguarda il trasferimento dei dati sul server, non sarà possibile (e probabilmente non dovrebbe) mantenere una connessione di lunga durata con il server.

Considerare la raccolta di dati e il caricamento sul server del batch raccolto di tanto in tanto, preferibilmente quando l'app viene riaperta, in modo da non sprecare risorse in background e far turbare le persone circa la durata della batteria e il consumo dei dati .

+1

Al momento non sono preoccupato per la durata della batteria. Preferirei risolvere il problema dopo aver avuto un esempio funzionante dell'app. Il punto dell'app è condividere gli aggiornamenti in diretta dei piloti, tutti devono essere in costante comunicazione. Se aspetto troppo a lungo per riportare la posizione di un corridore, tutti perdono. – EasilyBaffled

+0

Non sei preoccupato, ma Apple è stato quando ha progettato l'API, quindi i limiti .... Forse i piloti possono tenere l'app in primo piano. – Myst

+0

Anche se funziona su un livello base, è tutt'altro che ideale. Quando corro accendo la mia musica e spengo lo schermo del telefono, quindi lasciare l'app in primo piano non è un'opzione per me. – EasilyBaffled

Problemi correlati