React-native: iOS: NetInfo.isConnected gibt immer false zurück

Erstellt am 6. Juli 2016  ·  139Kommentare  ·  Quelle: facebook/react-native

Ich verwende derzeit RN 0.28.0 ...

NetInfo.isConnected.fetch().then(isConnected => {
      // variable isConnected is always false
    });

Ich würde PR machen, aber ich kann nicht für iOS codieren.

Help Wanted iOS Locked

Hilfreichster Kommentar

Nach den Vorschlägen von @ robertodias180 bin ich zum Wrapper für isConnected gekommen.
Es scheint zu funktionieren, aber ich frage mich, ob es in allen Fällen funktionieren wird

export function isNetworkConnected() {
  if (Platform.OS === 'ios') {
    return new Promise(resolve => {
      const handleFirstConnectivityChangeIOS = isConnected => {
        NetInfo.isConnected.removeEventListener('change', handleFirstConnectivityChangeIOS);
        resolve(isConnected);
      };
      NetInfo.isConnected.addEventListener('change', handleFirstConnectivityChangeIOS);
    });
  }

  return NetInfo.isConnected.fetch();
}

Alle 139 Kommentare

Ich kann dies auch mit RN 0.29.0 reproduzieren. Ich lief früher auf 0.26.2 und es funktionierte gut damit. Ich werde versuchen, aus dem Quellcode zu erstellen und zu debuggen.

+1

Ich habe das gleiche Problem bereits gemeldet: https://github.com/facebook/react-native/issues/8469

Eine schnelle Problemumgehung besteht darin, einen Ereignishandler NetInfo.isConnected.addEventListener('change', Function.prototype) hinzuzufügen

+1 und dasselbe Problem mit NetInfo.fetch (). Doed () - gibt immer unknown

Ich habe es so gelöst:

componentDidMount() {
  const dispatchConnected = isConnected => this.props.dispatch(setIsConnected(isConnected));

  NetInfo.isConnected.fetch().then().done(() => {
    NetInfo.isConnected.addEventListener('change', dispatchConnected);
  });
}

+1

Wir haben diesen Fehler in 0.29.2 gefunden.

Wir haben diesen Fehler in 0.28 gefunden

0.30.0 funktioniert immer noch nicht

Der relevante Code hat sich nicht geändert, daher ist es sinnvoll, dass er immer noch nicht funktioniert.

Beachten Sie, dass ich den Fehler zuvor hier gemeldet habe: https://github.com/facebook/react-native/issues/8469, wo die Ursache detailliert angegeben und Beispielcode angehängt ist. Aus diesem Grund halte ich es für sinnvoll, dies geschlossen zu lassen.

Die Anzahl offener RN-Probleme wächst täglich, daher ist es wichtig, unseren Beitrag zu leisten und nach Möglichkeit zu konsolidieren.

Ich habe heute das gleiche Problem festgestellt

Ich verwende die Version 0.30.0 und habe diesen Fehler auch gefunden.

Das gleiche Problem für mich, ich verwende [email protected] und der Abruf gibt immer unbekannt zurück.

Wir können aber stattdessen addEventListener verwenden.

NetInfo.addEventListener('change',
    (networkType)=> {
        this.setState({networkType})
    }
)

Anstatt von:

NetInfo.fetch().done(
    (networkType)=> {
        this.setState({networkType})
    }
)

@ Facebook-Github-Bot-Fehler

Ich habe dieses Problem auf 0.31. Wird dies behoben?

gleich 0,32

@knowbody Wie Can't find variable: setIsConnected sagte

@florentsorel In meinem Projekt verwende ich Redux für die setIsConnected ist mein Aktionsersteller, der ungefähr so aussieht:

actions/network.js

export const setIsConnected = (isConnected) => ({
  type: 'SET_IS_CONNECTED',
  isConnected
});

und dann habe ich einen network Reduzierer:

reducers/network.js

const initialState = {
  isConnected: true
};

const network = (state = initialState, action) => {
  switch (action.type) {
    case 'SET_IS_CONNECTED':
      return {
        isConnected: action.isConnected
      };

    default:
      return state;
  }
}

export default network;

+1

Ich habe dieses Problem auf v0.34.1

Bearbeiten: Aktualisiert auf v0.35.0 und das gleiche Problem.

Gleiches gilt für v0.35.0

Ich habe das gleiche Problem auf v0.36.0

@ Knowbody Snippet funktioniert für mich in

@Dnld : @Ehesp sagt, dass es auf v.036 funktioniert, Sie und 5 andere nicht? Ist das nicht irgendwann gelöst? Ich hatte auch Probleme mit 0.33 und möchte ein Upgrade durchführen. Vielen Dank.

Der zugrunde liegende Code hat sich nicht wirklich geändert, daher wäre ich überrascht, wenn dies "behoben" ist.

Ich habe Fix in Anführungszeichen gesetzt, weil es anscheinend die Motivation für diese Änderung ist, die native Maschinerie einzurichten, die den Netzwerkstatus überwacht, wenn der Anwendungscode daran interessiert ist, ihn zu beobachten.

Apps registrieren Interesse, indem sie einen Ereignis-Listener hinzufügen, der dann die Erreichbarkeit überprüft .

An diesem Punkt scheint dies das gewünschte Verhalten zu sein, daher ist möglicherweise eine Änderung der Dokumentation erforderlich. NetInfo.isConnected gibt einen Booleschen null oder einen Booleschen

Meine Apps haben Code, der dem von @knowbody sehr ähnlich ist. Ich nenne NetInfo.isConnected.fetch() überhaupt nicht, da es beim Start nutzlos ist.

Ich gehe davon aus, dass es Konnektivität gibt, füge den Listener hinzu und dann wird der Status aktualisiert, wenn der Konnektivitätsstatus nicht mehr unbekannt ist.

0.34.1 funktioniert immer noch nicht

Gleiches Problem mit RN 0.37.0

@ xing-zheng Aus irgendeinem Grund gibt Ihre Lösung nur 'MOBILE' zurück, selbst wenn ich das WLAN auf meinem Computer ausschalte, was sich in meinem Emulator widerspiegeln sollte. Irgendeine Idee warum?

componentDidMount() { NetInfo.addEventListener('change', (networkType)=> { this.setState({connected: networkType}) } ) }

Gleiches Problem mit RN 0.38.0

das gleiche auch in 0,39

Wenn ich die addEventListener-Lösung versuche, erkennt NetInfo nur ein oder zwei Verbindungsänderungen. Wenn ich beispielsweise mit einer Verbindung beginne und diese dann lösche, erkennt Netinfo dies, aber wenn ich die Verbindung wieder herstelle, kann Netinfo nicht erkennen, dass ich jetzt verbunden bin. NetInfo produziert in meiner App eine Menge falsch positiver Ergebnisse, selbst mit der Problemumgehung. Erlebt jemand anderes dasselbe?

Ich musste eine seltsame Problemumgehung erstellen, um dies zu lösen. Aus irgendeinem Grund funktioniert eine Methode unter Android und die andere unter iOS. Eine Lösung dafür wäre großartig.

function handleFirstConnectivityChange(isConnected) {
    if (!sConnected) {
     // do action
    } 
    NetInfo.isConnected.removeEventListener('change', handleFirstConnectivityChange);
}

if (Platform.OS === 'ios') {
    NetInfo.isConnected.addEventListener('change', handleFirstConnectivityChange); 
} else {
    NetInfo.isConnected.fetch().then(isConnected => {
    if (!sConnected) {
        // do action
    } 
}

@ robertodias180 es funktioniert nicht.

RN-0,39+

Funktion handleFirstConnectivityChange (isConnected) {
if (! sConnected) {
// Aktion ausführen
}}
NetInfo.isConnected.removeEventListener ('change', handleFirstConnectivityChange);
}}

if (Platform.OS === 'ios') {
NetInfo.isConnected.addEventListener ('change', handleFirstConnectivityChange);
} else {
NetInfo.isConnected.fetch (). Then (isConnected => {
if (! sConnected) {
// Aktion ausführen
}}
}}

Können Sie mir bitte helfen?

@imbudhiraja funktioniert es auf einer der Plattformen?

Nein, es funktionierte auf keiner Plattform

Vielen Dank
Manish Budhiraja

Am 3. Januar 2017, 20:12 Uhr, schrieb "Roberto Dias" [email protected] :

@imbudhiraja https://github.com/imbudhiraja funktioniert es auf einem der
Plattformen?

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/facebook/react-native/issues/8615#issuecomment-270128504 ,
oder schalten Sie den Thread stumm
https://github.com/notifications/unsubscribe-auth/AVTjXHSe8OcVq8fQ5XVk8hh9XXHfHFVZks5rOl5ggaJpZM4JGaBc
.

Es sieht so aus, als ob dies zwei Probleme sein könnten:

  1. isConnected.fetch scheint unter iOS kaputt zu sein - das Update sollte unkompliziert sein. Die von @ robertodias180 veröffentlichte abgefragt wird.
  2. Die von @Aristekrat beschriebene NetInfo-Flakyness . Dies ist besorgniserregender. Kann jemand helfen, dieses Problem detailliert zu reproduzieren? Dann sollte ich helfen können, das Problem zu beheben.

RN 0.38.1 und früher, iOS Simulator.

componentDidMount() {
    NetInfo.isConnected.fetch().then(this._handleConnectionInfoChange);
    NetInfo.isConnected.addEventListener(
        'change',
        this._handleConnectionInfoChange
    );
 }

 componentWillUnmount(){
     NetInfo.isConnected.removeEventListener(
        'change',
        this._handleConnectionInfoChange
    );
 }

_handleConnectionInfoChange(isConnected){
    this.props.connectActions.netInfo(isConnected);

    dbg('connected', isConnected);

};

Das anfängliche NetInfo.isConnected.fetch().then(this._handleConnectionInfoChange); ruft den aktuellen Verbindungsstatus korrekt ab. Nachfolgende Änderungen des Verbindungsstatus werden jedoch nicht vom eventListener erfasst.

Ich habe dieses Problem jetzt für viele RN-Versionen.

@imbudhiraja Am Ende initializeConnection wenn die App geöffnet wird und dann isConnected wenn ich brauche. Bitte nicht, dass es einige dauern kann, bis NetInfo den Verbindungsstatus erhält, wenn die App geöffnet wird (insbesondere auf Android). Ich habe gerade eine Verzögerung bis hasConnection !== null . Ich hoffe es hilft

const hasConnection = null;

export const initializeConnection = () => {

  const dispatchConnected = isConnected => { hasConnection = isConnected; };

  NetInfo.isConnected.fetch().then().done(() => {
    NetInfo.isConnected.addEventListener('change', dispatchConnected);
  });

}

export const isConnected = () => {
  NetInfo.fetch().done((reach) => {
    console.log('Initial: ' + reach);
  });
  return hasConnection;
}

Ich habe etwas Ähnliches versucht und bin immer wieder auf die Situation gestoßen, dass der eventListener es nicht erkennt, wenn die Verbindung zurückkehrt (auf dem Simulator).

App ohne Internetverbindung neu laden => Erkannt
Schalten Sie das Internet wieder ein => NICHT erkannt

App mit Internetverbindung neu laden => Erkannt
Internet ausschalten => Erkannt
Schalten Sie das Internet wieder ein => NICHT erkannt

<strong i="11">@autobind</strong>
export default class ConnectionToast extends React.Component {

    constructor(props){
        super(props);
    }

    componentDidMount() {
        NetInfo.isConnected.fetch()
            .then(this._handleConnectionInfoChange)
            .done(this._addListener);
     }

     componentWillUnmount(){
         this._removeListener();
     }

     _addListener(){
         NetInfo.isConnected.addEventListener(
             'change',
             this._handleConnectionInfoChange
         );
     }

     _removeListener(){
         NetInfo.isConnected.removeEventListener(
            'change',
            this._handleConnectionInfoChange
        );
     }

    _handleConnectionInfoChange(isConnected){
        this.props.connectActions.netInfo(isConnected);

        dbg('connected', isConnected);

        // this._removeListener();
        // this._addListener();

    }

[...]

Versucht, den Hörer bei jeder Änderung zu entfernen und wieder hinzuzufügen, aber keine Freude.

@mschipperheyn Ich habe genau das gleiche Problem mit dem Ansatz, den @knowbody zuvor gepostet hat.

Die Dokumente implizieren auch, dass es nur die erste Änderung über handleFirstConnectivityChange handhaben würde. Ist das richtig oder sollte es alle nachfolgenden Änderungen erkennen?

Stell sicher dass du hast

in Ihrer Android-Manifest-Datei festgelegt. Dieser hat mich gestolpert.

Gleiches Problem mit RN 0.41.0

Fügen Sie unter iOS keinen Listener hinzu und registrieren Sie SCNetworkReachabilitySetCallback nicht. sicherlich nicht funktioniert. Was ist der Designzweck?

gleich zu 0,41,2

@djohnkirby In Ihrem Kommentar fehlt das XML, von dem ich glaube, dass Sie es veröffentlichen

Die Zeile, die Sie zu AndroidManifest.xml hinzufügen möchten, lautet:

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

0.39.2: Gleiches Problem. Das Ergebnis von NetInfo fetch ist nicht immer false , sondern es erkennt auch schnell nach dem Start der App eine Änderung des Verbindungsstatus

0.42.0: Gleiches Problem. Ich habe mein Problem auch hier beschrieben: https://stackoverflow.com/questions/42642034/check-for-internet-connection-returns-wrong-results
Ich teste auf iOS und MacOS Sierra.

UPDATE : Mein Problem war das Testen auf dem Simulator, auf einem realen Gerät funktioniert alles. Beantwortet im obigen Link.

Ich habe das gleiche Problem :(

NetInfo.isConnected.fetch().then((isConnected) => { console.log(isConnected); });
// always return false

Für den Fall, dass jemand wissen möchte, ob die App auf dem Simulator ausgeführt wird oder nicht: http://stackoverflow.com/a/34732015/552669

Es ist kein Fehler. Das native Modul RCTNetInfo ist eine Unterklasse von RCTEventEmitter , daher müssen wir einen Beobachter hinzufügen, um die Methode startObserving auszulösen.
Fügen Sie in Ihrem App-Startprozess einen beliebigen Beobachter zu NetInfo hinzu, und rufen Sie dann die Funktion fetch . (NetInfo.isConnected ruft tatsächlich die Abruffunktion auf.)

Nach den Vorschlägen von @ robertodias180 bin ich zum Wrapper für isConnected gekommen.
Es scheint zu funktionieren, aber ich frage mich, ob es in allen Fällen funktionieren wird

export function isNetworkConnected() {
  if (Platform.OS === 'ios') {
    return new Promise(resolve => {
      const handleFirstConnectivityChangeIOS = isConnected => {
        NetInfo.isConnected.removeEventListener('change', handleFirstConnectivityChangeIOS);
        resolve(isConnected);
      };
      NetInfo.isConnected.addEventListener('change', handleFirstConnectivityChangeIOS);
    });
  }

  return NetInfo.isConnected.fetch();
}

Gleicher Fehler. 0,40

Ich habe das gleiche Problem

0.42.3 - Ich hatte das gleiche Problem mit iOS sowohl auf dem Simulator als auch auf einem tatsächlichen Gerät. Die Verwendung der Lösung von @ Knight704 hat das Problem gemildert.

Gleiches gilt für 0.42.3

Gleiches gilt für 0.43.1

Sehen Sie dies auf 0,40

mit diesem Problem auch. Konnte es zufällig arbeiten lassen, dann hörte es auf zu arbeiten.

Die Lösung von @ Knight704 funktionierte zunächst für mich, aber aus irgendeinem Grund funktioniert die Funktion nicht mehr, wenn ich sie einmal aus der zweiten Ebene eines Navigators in einem Modal aufrufe (handleFirstConnectivityChangeIOS wird nie aufgerufen), selbst nachdem ich das Modal geschlossen habe. Sehr merkwürdiges Verhalten, keine Ahnung, warum dies nicht funktioniert oder ob es etwas anderes in meiner Codebasis ist, das mit NetInfo nicht gut funktioniert.

Was vermisse ich?

    this.state = {
            isConnected: null,
     }
    componentDidMount() {
        console.log('first one ', this.state.isConnected)
        NetInfo.isConnected.addEventListener(
            'change',
            this._handleConnectivityChange
        );
        console.log('second ', this.state.isConnected)
        NetInfo.isConnected.fetch().done(
            (isConnected) => {this.setState({isConnected});}
        );
        console.log('third ', this.state.isConnected)
    }
    componentWillUnmount(){
        console.log('did it unmount ', this.state.isConnected)
        NetInfo.isConnected.removeEventListener(
            'change',
            this._handleConnectionInfoChange
        );
        console.log('it did unmount ', this.state.isConnected)
    }
    _handleConnectivityChange = (isConnected) => {
        this.setState({
            isConnected,
        });
    };
   render() {
      console.log('fourth ', this.state.isConnected)
        if(this.state.isConnected === false){
            const connectAlert = (Alert.alert(
                'ERROR',
                'No connection bro!',
                [
                    {text: 'OK'},
                ]
            ))
        }
        return ()
}

Wenn ich es starte, bin ich manchmal alarmiert, nicht immer ...

Dies sind die Konsolenprotokolle, die zurückgegeben werden, wenn ich benachrichtigt werde, auch wenn eine Verbindung besteht:

'fourth ', null
'first one ', null
'second ', null
'third ', null
'fourth ', false
'fourth ', true

Das gleiche Problem wie bei @SteffeyDev tritt auf, wenn ich das Update von https://github.com/facebook/react-native/issues/8615#issuecomment -287977178 verwende. In den meisten Fällen funktioniert dies jedoch einwandfrei Pushed oder Popped Modals wird derselbe Code niemals aufgelöst, da ich davon ausgehe, dass das change -Ereignis bereits ausgegeben wurde.

Ich habe festgestellt, dass unter diesen Bedingungen NetInfo.fetch() einen unknown -Zustand zurückgeben würde (dies wird einen false unter NetInfo.isConnected.fetch() auslösen, und so konnte ich ihn umgehen mit der folgenden Änderung an der ursprünglichen Problemumgehung:

export function isNetworkConnected() {
  return NetInfo.fetch().then(reachability => {
    if (reachability === 'unknown') {
      return new Promise(resolve => {
        const handleFirstConnectivityChangeIOS = isConnected => {
          NetInfo.isConnected.removeEventListener('change', handleFirstConnectivityChangeIOS);
          resolve(isConnected);
        };
        NetInfo.isConnected.addEventListener('change', handleFirstConnectivityChangeIOS);
      });
    }
    reachability = reachability.toLowerCase();
    return (reachability !== 'none' && reachability !== 'unknown');
  });
}

Die Bedingung unknown wird nur unter iOS ausgelöst, da Android UNKNOWN zurückgibt. Dies ist auch der Grund für Kleinbuchstaben vor der Rückgabe des Status, da hierdurch das vorhandene Verhalten von NetInfo.isConnected.fetch mehr oder weniger beibehalten werden sollte.

gleich in 0,44

Zuerst habe ich festgestellt, dass NetInfo die Änderung des Netzwerkstatus erst nach einem Zyklus (Ein -> Aus) zurückgeben möchte. Es stellte sich heraus, dass es nur dieses Problem im Simulator gibt. Auf einem realen Gerät wird der Rückruf auch für mehrere Verbindungs- / Trennungszyklen ordnungsgemäß ausgelöst.

Beispielcode

  NetInfo.addEventListener( 'change', this._onConnectivityChange );

  _onConnectivityChange(connType) {
    // Do something with connType...
  }

Dieses Problem hat mich eine Weile gestört und ich habe indirekt eine kleine Dienstprogrammbibliothek erstellt, die sich auf die Offline- / Online-Erkennung von RN konzentriert und typische Reaktionsmuster und eine gute Integration mit Redux umfasst.

Es funktioniert ordnungsgemäß auf realen Geräten, sowohl Android als auch iOS. Ich kann jedoch auch bestätigen, dass der Listener manchmal nicht im iOS-Simulator ausgelöst wird und der Konnektivitätsstatus inkonsistent wird. Ich habe die von @ knight704 und @Ignigena vorgeschlagenen Lösungen ( hier und hier ) noch nicht ausprobiert, werde sie aber wahrscheinlich bald testen, wenn ich etwas Zeit habe.

Eine PR ist auch sehr willkommen, wenn mehr Leute bestätigen, dass diese Lösungen wie ein Zauber wirken!

Bitte repariere.

Wenn dies wahrscheinlich nicht bald behoben wird, können wir dann zumindest die Dokumente aktualisieren, um anzuzeigen, dass dies unter iOS nicht funktioniert?

@ jpb12 Vielleicht lohnt es sich, die PR zu machen und zu sehen, ob sie zusammengeführt werden. Kann dies tatsächlich sichtbarer machen, da es vergessen zu sein scheint.

Ich bin mit diesem Problem in der Android-Version konfrontiert. Es scheint damit zu tun zu haben, in den Hintergrund zu treten und wieder in den Vordergrund zu treten. Leider kann ich dieses Problem nicht zuverlässig reproduzieren, aber es tritt definitiv nach mehreren Übergängen zwischen Hintergrund und Vordergrund auf. Insbesondere, wenn der Verbindungsstatus zu diesem Zeitpunkt geändert wurde

Wenn es passiert
NetInfo.isConnected.fetch().then(isConnected => {...}) immer false
NetInfo.fetch().then((reach) => {...}) immer NONE
Das Hinzufügen / Entfernen von Listenern hilft nicht

Ich wäre sehr dankbar für jeden zuverlässigen Weg, um den tatsächlichen Verbindungsstatus zu erkennen

Ich habe ein seltsames Verhalten, weil isConnected true zurückgibt, wenn eine Verbindung zu WLAN hergestellt wird (bisher ist dies in Ordnung), aber wenn das Modem das Internet nicht erreicht, ist isConnected immer noch true. Ich bin mir nicht sicher, wie ich die Internetverbindung effektiv überprüfen soll, nicht nur die Netzwerkverbindung. Irgendwelche Ideen? Vielen Dank

@kodatech Dieses Modul soll Ihnen bei der Behebung dieses Problems helfen. Ich habe es kürzlich für ein Projekt verwendet und kann es nur empfehlen https://github.com/rauliyohmc/react-native-offline

Vielen Dank @craigcoles

@ Knight704 danke Bruder.

@craigcoles Hast du einen

@nmfzone Ich habe nichts, was ich Ihnen zeigen kann, aber es gibt viele Codebeispiele in der Readme 😃

Ich verwende die Netinfo-Listener-Ereignisse wie folgt, sie funktionieren auf beiden Plattformen hervorragend.
"React-Native": "0,43,4",

componentDidMount(){
        NetInfo.isConnected.addEventListener('change', this._handleConnectivityChange);

    }

    componentWillUnmount(){
        NetInfo.isConnected.removeEventListener('change', this._handleConnectivityChange);
    }

    _handleConnectivityChange = (isConnected) => {
         console.warn(isConnected);
    }

@ sumesh1993 Nach meiner Erfahrung 'change' . Getestet auf meinem Galaxy Note 5, Android 7.0

Das Modul https://github.com/rauliyohmc/react-native-offline, das oben empfohlen wurde, pingt nur kontinuierlich https://google.com . Es funktioniert, aber ich würde es vorziehen, diesen Fehler zu beheben

Dies ist sinnvoll, da Android-Apps im Hintergrund angehalten werden. Um Ereignisse zu empfangen, müssen Sie einen Dienst erstellen, der auch dann ausgeführt wird, wenn die App angehalten wird.

Alternativ können Sie der App einen onResume-Handler hinzufügen und dann den Offline-Status abfragen. Das sollte einfacher sein als das Erstellen und Verwalten eines Dienstes.

@ alsh76 für mich funktioniert es, wenn sich die App im Hintergrund befindet, es funktioniert nicht, wenn die App aus dem Multitasking-Menü beendet wird.
Ich habe das behoben, indem ich die folgende Funktion aufgerufen habe, wenn mein Startbildschirm gestartet wird.
if(Platform.OS === 'android'){ NetInfo.isConnected.fetch().then(isConnected => { if(!isConnected) return; //Do something }); }

Habe das gleiche Problem mit Android Virtual Device. Aber die Sache ist, dass es vor ein paar Tagen in Ordnung war und dies immer noch auf iOS-Geräten und Emulatoren tut. Hat jemand einen stabilen und korrekten Weg gefunden, um den Netzwerkverbindungsstatus zu erhalten?

Danke @ sumesh1993 , das hat den Trick für mich in iOS gemacht!
@igorarkhipenko hast du seinen Vorschlag ausprobiert?

Hallo, hast du die Erlaubnis hinzugefügt, zum Beispiel muss Android hinzufügen
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Nur ein kleines Update der Lösungen von @ Knight704 und @Ignigena als NetInfo.fetch ist jetzt veraltet. Das hat den Trick für mich getan:
`` `
const isNetworkConnected = () => {
Geben Sie NetInfo.getConnectionInfo () zurück. then (Erreichbarkeit => {
if (erreichbarkeitstyp === 'unbekannt') {
neues Versprechen zurückgeben (Entschlossenheit => {
const handleFirstConnectivityChangeIOS = isConnected => {
NetInfo.isConnected.removeEventListener ('connectionChange', handleFirstConnectivityChangeIOS);
auflösen (isConnected);
};
NetInfo.isConnected.addEventListener ('connectionChange', handleFirstConnectivityChangeIOS);
});
}}
return (erreichbarkeitstyp! == 'keine' && erreichbarkeitstyp! == 'unbekannt')
});
}}

Imho NetInfo.isConnected.fetch() ist eine wichtige Funktion und sollte so schnell wie möglich behoben werden!

@javache @sahrens @davidaurelio @janicduplessis @hramos @shergin @rigdern Gibt es dafür einen Zeitplan?

Danke!

@pensierinmusica Dies ist ein Community-Projekt, daher würde ich gerne gute PR landen.

@shergin Ich dachte, React Native wurde von Facebook intern erstellt, gepflegt und verwendet und aus diesem Grund unter einer BSD 3-Klausel-Lizenz veröffentlicht. Daher ging ich davon aus, dass Facebook-Mitarbeiter Fehler beheben würden, insbesondere wichtige. Wie auch immer, gut zu wissen, dass PRs willkommen sind!

cc @rigdern

Viele der RN-Kerncodes werden von der Community geschrieben und verwaltet.

Und es gibt viele Features und Funktionen, die von Facebook nicht verwendet werden. Daher fällt es uns schwer, Prioritäten zu setzen und Community-PRs zu bevorzugen, bei denen der Autor die Korrektur für ihren Fehler / Anwendungsfall überprüfen kann.

Ich habe auch ein Problem in der Reaktion 0.47.0 mit ios.

@pensierinmusica Dieses Problem sollte auf jeden Fall priorisiert werden. Wie schwierig kann es sein, eine boolesche Rückkehr von .isConnected () zu erhalten?

Okay, hier ist eine Out-of-the-Box-Problemumgehung, die den Trick machen sollte (gut, das tut es für mich). Ich sende eine http-Anfrage an eine Site, von der ich weiß, dass sie aktiv ist, und werte die Antwort aus.

Ich habe ein Repo initialisiert, das sofort funktionieren sollte. https://github.com/JamesDorrian/NetInfoCheckConnection/tree/master

Hinweis: Stellen Sie sicher, dass Sie die Variable httpAddress von https://www.galwaydaily.com in etwas anderes (möglicherweise google.com) ändern, da ich nicht garantieren kann, dass sie immer aktiv ist. Ich hoffe, das hilft jedem, der von NetInfo frustriert ist!

@pensierinmusica @anujsinghwd

@ JamesDorrian danke, am Ende habe ich etwas Ähnliches gemacht und "google.com"

Hier ist der Ausschnitt:

// /utilities/connectivity.js

import { Alert } from 'react-native';

export function warning () {
  Alert.alert(
    'No connection',
    'Mmm... you seem to be offline'
  );
};

export async function checkAsync () {
  try {
    const res = await fetch('https://google.com');
    if (res.status === 200) return true;
  } catch (e) {
    warning();
  }
  return false;
};

Dies ist jedoch nur eine vorübergehende Problemumgehung, und ich denke, dass NetInfo.isConnected so schnell wie möglich behoben werden sollte!

let isConnected = false;

Platform.OS === "ios" 
  ? (isConnected = await fetch("https://www.google.com"))
  : (isConnected = await NetInfo.isConnected.fetch());

Platform.OS === "ios" && (isConnected.status = 200)
  ? (isConnected = true)
  : (isConnected = false);

console.log(isConnected); //Result

Können wir bitte mit den +1 -Kommentaren zu diesem Thema aufhören? Dafür werden Reaktionen verwendet.

ios:
erste Anfrage. Wenn der Server abstürzt, hat das Telefon WLAN.
NetInfo.isConnected.fetch (). Then ((isConnected) => {immer falsch}
0,49,3.

@kddc Ihre Lösung scheint in der Entwicklung gut zu funktionieren 👍

Fügen Sie einfach die hier bereitgestellt wurde. Dies ist die Lösung.

@fuatsengul Ich habe das Reachability-Projekt als Bibliothek in mein Xcode-Projekt aufgenommen, aber das Problem ist immer noch nicht gelöst.

Das Problem scheint nur bei der Abruf-API zu liegen. Das Hinzufügen eines Ereignis-Listeners funktioniert jedoch mit iOS . AddEventListener funktioniert jedoch nicht mit Android, sodass Sie die Abruf-API verwenden müssen :)

Hier ist mein Ausschnitt, damit es auf beiden Welten funktioniert:

function handleFirstConnectivityChange(isConnected) {
  console.log('Then, is ' + (isConnected ? 'online' : 'offline'))
  NetInfo.isConnected.removeEventListener(
    'connectionChange',
    handleFirstConnectivityChange,
  )
}

if (Platform.OS === 'android') {
    NetInfo.isConnected.fetch().then(isConnected => {
      console.log('First, is ' + (isConnected ? 'online' : 'offline'))
    })
  } else {
    NetInfo.isConnected.addEventListener(
      'connectionChange',
      handleFirstConnectivityChange,
    )
  }

Es wird offline in IOS angezeigt, obwohl es verbunden ist
RN - 0,50

NetInfo.isConnected.fetch().then(isConnected => { console.log('First, is ' + (isConnected ? 'online' : 'offline')); });

@kddc danke für die
Auf meinem iOS-Gerät ist ein Problem aufgetreten. Das Szenario sieht wie folgt aus:

  1. ios -> Flugzeugmodus ist eingeschaltet
  2. Fetch ausführen -> 'Netzwerkfehler' abrufen, isConnected ist false und Reachability.type ist none
  3. ios -> Flugzeugmodus ist ausgeschaltet
  4. Fetch ausführen -> 'Netzwerkfehler' abrufen, isConnected ist false und Reachability.type ist none

Die gesamte Zeit, in der die Anwendung ausgeführt wird, im Hintergrund, während der Flugzeugmodus geändert wird.
Nur ein Neustart der App "fängt" die neue Netzwerkverbindung.

+1

+1

Danke für das Update @ alburdette619
Also, dies ist behoben in wird in Version 0.54 verfügbar sein?

@ assafb81 Ich bin mir nicht sicher, anscheinend landen sie es intern und ich bin mir nicht sicher, wie der Prozess dafür ist, oder?

Wenn Ihre Pull-Anfrage zusammengeführt wird, nimmt Facebook sie zunächst in das interne React Native-Repo auf und führt unter anderem zusätzliche Tests durch. Wenn dies erfolgreich ist, wird die Änderung zurück in das GitHub-Repo exportiert.

Wenn Sie sich die Aktivität Ihrer Pull-Anfrage ansehen, können Sie sehen, dass Ihr Commit jetzt auf GitHub zusammengeführt wird . Anhand der Commit-Informationen können Sie erkennen, in welchen Zweigen sie enthalten sind. Derzeit befindet sie sich nur im Zweig "Master":

image

Wenn Sie sich zum Vergleich ein älteres Commit ansehen

image

Zu Beginn eines jeden Monats wird basierend auf "master" ein neuer Release Candidate-Zweig erstellt. Ihre Änderung wird also voraussichtlich Anfang März im nächsten Release-Kandidaten enthalten sein. Weitere Informationen zum Veröffentlichungsplan von React Native finden Sie in diesem Blogbeitrag .

Adam Comella
Microsoft Corp.

Hat jemand dieses Problem mit dem neuesten RN 54 überprüft? Für mich ist es jetzt unter iOS immer wieder "wahr" und unter Android funktioniert es einwandfrei. Hat noch jemand dieses Problem gesehen?

0.53 immer falsch .. @deepaksasken .. anscheinend muss ich den Code nur für Android deaktivieren .. Kann

@ alien3d Du meinst, es für iOS deaktivieren und nur für Android behalten? In Android funktioniert es?

@afilp Ich folge einfach dem obigen Beispiel für iOS

    if (Platform.OS === "ios") {
            isConnected = await fetch("https://www.google.com");
            if (isConnected) { }
  } else { 
    NetInfo.isConnected.fetch().done(
                (isConnected) => {
                    if (isConnected) { }
} 

Ich brauche noch viele Tests, bevor ich sie als stabil betrachte. jetzt mit zurück 0,530

@ assafb81 Haben Sie eine Lösung für das Problem mit dem Flugzeugmodus gefunden? Ich verwende Ihre Lösung in 0.53.

@aflip Wenn Daten aktiviert sind, aber noch kein Paket vorhanden ist, wird isConnected true zurückgegeben. Haben Sie versucht, es zu lösen?

Warum gibt es einen removeEventListener? Sollte die App nicht jederzeit Netzwerkänderungen abhören? Jemand?

Habe auch das gleiche Problem wie die oben genannten Benutzer. NetInfo-Ereignis-Listener scheinen sehr unzuverlässig zu sein. Ich habe viele der oben genannten Problemumgehungen ohne stabile Ergebnisse ausprobiert. Im Moment werde ich https://google.com oder einen Integritätsendpunkt auf meinen eigenen Servern abrufen, um sicherzustellen, dass meine Benutzer über eine Internetverbindung verfügen.

@ MichaelPintos Es funktioniert für mich, danke.

RN 0,54,2
Betriebssystem: iOS
gleiches Problem, immer unbekannt

Wenn ich RN auf 0.55.3 aktualisiere

Ich benutze diesen Code, gebe zuerst unbekannt zurück, und dann funktioniert es

    NetInfo.getConnectionInfo()
        .then()
        .done(() => {
                switch (connectionInfo.type) {
                    case 'none':
                        Alert.alert('aa', 'none');
                        break;
                    case 'wifi':
                        Alert.alert('aa', 'wifi');
                        break;
                    case 'cellular':
                        if (connectionInfo.effectiveType !== 'unknown') {
                            Alert.alert('aa', `cellular ${connectionInfo.effectiveType}`);
                        } else {
                            Alert.alert('aa', 'cellular unknown');
                        }
                        break;
                    case 'unknown':
                        Alert.alert('aa', 'unknown');
                        break;
                    default:
                        Alert.alert('aa', 'default');
                        break;
                }
            });
        });

Ok, also lass uns einen kleinen Trick machen.

    NetInfo.getConnectionInfo()
        .then()
        .done(() => {
            NetInfo.getConnectionInfo().then(connectionInfo => {
                switch (connectionInfo.type) {
                    case 'none':
                        Alert.alert('aa', 'none');
                        break;
                    case 'wifi':
                        Alert.alert('aa', 'wifi');
                        break;
                    case 'cellular':
                        if (connectionInfo.effectiveType !== 'unknown') {
                            Alert.alert('aa', `cellular ${connectionInfo.effectiveType}`);
                        } else {
                            Alert.alert('aa', 'cellular unknown');
                        }
                        break;
                    case 'unknown':
                        Alert.alert('aa', 'unknown');
                        break;
                    default:
                        Alert.alert('aa', 'default');
                        break;
                }
            });
        });

Das ist meine Lösung. Erwarten Sie eine offizielle Lösung.

Speziell auf 55 aktualisiert, weil das Änderungsprotokoll besagt, dass es das beheben soll - immer noch defekt (0,55,3).

Ich kann es mit einer ähnlichen Lösung wie @ yuyao110120 zum

NetInfo.isConnected.fetch().then(() => {
  NetInfo.isConnected.fetch().then(isConnected =>
    // isConnected is now the correct value
  });
});

Ich vertraue nicht mehr NetInfo (reaktionsnativ 0.53.3)
Folgendes tue ich, um sicherzustellen, dass es Internet gibt:

async function handleConnectivityChange(status) {
  const { type } = status;
  let probablyHasInternet;
  try {
    const googleCall = await fetch(
        'https://google.com', {
        headers: {
          'Cache-Control': 'no-cache, no-store, must-revalidate',
          Pragma: 'no-cache',
          Expires: 0,
        },
      });
    probablyHasInternet = googleCall.status === 200;
  } catch (e) {
    probablyHasInternet = false;
  }

  console.log(`@@ isConnected: ${probablyHasInternet}`);

}

  NetInfo.getConnectionInfo().then(handleConnectivityChange);
  NetInfo.addEventListener('connectionChange', handleConnectivityChange);

@SudoPlz Ich habe das gleiche mit meinen Apps gemacht, funktioniert NetInfo API sollte definitiv repariert werden haha!

@SudoPlz Ich habe festgestellt, dass fetch die Anfrage unter Android zwischenspeichert. Sie müssten ihm einige Überschriften geben, um dies zu verhindern.

      const googleRequest = await fetch('https://www.google.com', {
        headers: {
          'Cache-Control': 'no-cache, no-store, must-revalidate',
          'Pragma': 'no-cache',
          'Expires': 0
        }
      });

Ok, danke, dass du mich über @AbdallaMohamed informiert

Wie @kylevdr , hat zuverlässig

Edit: fwiw das funktioniert in 55.3, aber nicht in 55.4

Das Hinzufügen eines ersten Listener für Verbindungsereignisse führt dazu, dass NetInfo.getConnectionInfo() und NetInfo.isConnected.fetch() beim ersten Aufruf ordnungsgemäß funktionieren.

const onInitialNetConnection = isConnected => {
    console.log(`Is initially connected: ${isConnected}`);

    NetInfo.isConnected.removeEventListener(
        onInitialNetConnection
    );
};

NetInfo.isConnected.addEventListener(
    'connectionChange',
    onInitialNetConnection
);

// both now work on the first call.
await NetInfo.getConnectionInfo();
await NetInfo.isConnected.fetch();

Danke # 8469

Stellen Sie sicher, dass Sie diese Datei importieren, da sie sonst nicht ausgeführt wird.

PS Wenn Sie fetch , verwenden Sie method: 'HEAD' , um die übertragene Datenmenge zu reduzieren.

Keine der oben genannten Lösungen funktionierte, wenn die App im Debug-Modus auf einem iPhone 8 (React Native 0.55.3, iOS 11.3.1) im folgenden Szenario ausgeführt wurde: Schließen Sie die App und starten Sie sie mit mobilen Daten und ausgeschaltetem WLAN.

Alle nachfolgenden Ereignisse gehen mit allen oben genannten Lösungen verloren (mit Ausnahme der Antwort von @SudoPlz ). Nur das Ausführen der Anwendung im Release-Modus auf dem Gerät oder im Debug-Modus auf einem Simulator löste NetInfo Ereignisse aus.

@nlindroos Bestätigen Sie also tatsächlich, dass NetInfo auf Geräten, auf denen die Release-Version ausgeführt wird, einwandfrei funktioniert?

Im speziellen Fall des Startens der Anwendung im Offline-Modus auf einem physischen iOS-Gerät war die Ausführung im Release-Modus die einzige funktionierende Lösung, um NetInfo Ereignisse auszulösen. Ich habe nicht alle verwandten Szenarien ausreichend getestet, um dafür als generische Lösung für alle NetInfo -Probleme zu bürgen.

Ich kann sagen, dass die Kombination der Lösungen, die @woodpav und @AbdallaMohamed für mich gearbeitet haben
Ich verwende RN Version 0.55.4

Ich muss den Google-Server häufig anpingen, um nach einer Internetverbindung zu suchen

Ich verwende den iPhone 8 - 11.3 Simulator und auf RN Version 0.55.4 NetInfo.isConnected.fetch (). Then (isConnected => console.log ('isConnected', isConnected))
Gibt immer false zurück. Dies ist auch in der Telefonproduktion ein Problem. Ich habe Variationen von mobilen Daten und WLAN ausprobiert.

Beim Zurückschalten auf RN Version 0.55.3 scheint es wieder zu funktionieren.

@octopitus , @martinentelect
Dies ist mein Code. Ich verwende die native React-Version 0.55.4 und es ist eine sinnvolle und funktionierende Problemumgehung, bis NetInfo behoben ist.
In meiner api.js-Datei habe ich diesen Code

import { NetInfo } from 'react-native';
import { url } from '[AppName]/src/config';

export const onInitialNetConnection = () => {
    NetInfo.isConnected.removeEventListener(onInitialNetConnection);
};

const getDataById = async (dataId) => {
    // both now work on the first call.
    await NetInfo.getConnectionInfo();
    const isConnected = await NetInfo.isConnected.fetch();
    if (!isConnected) {
        throw new Error('networkError');
    }
    const response = await fetch(`${url}${dataId}`, {
        headers: {
            'Cache-Control': 'no-cache, no-store, must-revalidate',
            Pragma: 'no-cache',
            Expires: 0,
        },
    });
    if (response.ok) {
        return response.json();
    }
    throw new Error('invalidCode');
};

export default getDataById;

In meiner App.js -Datei (meinem Einstiegspunkt in die Anwendung) füge ich den Ereignis-Listener hinzu:

NetInfo.isConnected.addEventListener(
            'connectionChange',
            onInitialNetConnection,
        );

@ assafb81 Danke! Dies hat meinem Anwendungsfall geholfen.

In meinem Fall funktioniert der Ereignis-Listener perfekt unter iOS, aber überhaupt nicht unter Android (zumindest auf dem Emulator).
Gibt es Problemumgehungen für Hörer unter Android, während NetInfo noch verwendet wird?

    NetInfo.isConnected.addEventListener(
      "connectionChange",
      this.handleConnectionChange
    ); 

Verwenden


this.count = 0
handleConnectivityChange(isConnected) {
   //for iOS
    this.count++
  console.log(isConnected + "isConnected")
  if(this.count > 1){
    console.log(isConnected + "this is the right value")
  }

@tannera ,
Überprüfen Sie auf echten Android-Gerät und nicht Emulator

Auf 0.55.4 dies immer noch ein Fehler, und ich wurde gerade von der Produktion getroffen 😢

Immer noch nicht auf 0,56 festgelegt

@SudoPlz Ich habe Ihren Kommentar zum Diskussionsthread 0.57 als Off-Topic ausgeblendet. Wie Sie wissen, gibt es im Repo Hunderte offener Probleme, aber dieser Thread konzentriert sich darauf, eine Version von 0,57 herauszubringen.

Dieser geschlossene Thread ist für Betreuer so gut wie unsichtbar, und ich bin überrascht, dass sechs Monate nach der Landung eines potenziellen Fixes niemand ein neues Problem eröffnet hat. Wenn dies im Master behoben werden soll, öffnen Sie bitte ein neues Problem mit Details und senden Sie im Idealfall eine PR.

Hier ist ein minimal reproduzierbares Beispiel (auf einem iOS-Gerät getestet), mit einem Code von @woodpav, der oben freigegeben wurde, um das oben auskommentierte Problem zu umgehen: https://snack.expo.io/@notbrent/netinfo -repro.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen