React-native: iOS: NetInfo.isConnected selalu menampilkan false

Dibuat pada 6 Jul 2016  ·  139Komentar  ·  Sumber: facebook/react-native

Saya saat ini menjalankan RN 0.28.0 ...

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

Saya akan melakukan PR tetapi saya tidak bisa membuat kode untuk iOS.

Help Wanted iOS Locked

Komentar yang paling membantu

Menurut saran @ robertodias180 saya datang ke pembungkus untuk isConnected,
Tampaknya berhasil, tetapi saya bertanya-tanya apakah itu akan berhasil dalam semua kasus

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

Semua 139 komentar

Saya juga dapat mereproduksi ini dengan RN 0.29.0. Saya menjalankan 0.26.2 sebelumnya dan itu bekerja dengan baik dengannya. Akan mencoba membangun dari sumber dan debug.

+1

Saya telah melaporkan masalah yang sama sebelumnya: https://github.com/facebook/react-native/issues/8469

Solusi cepatnya adalah dengan menambahkan event handler NetInfo.isConnected.addEventListener('change', Function.prototype)

+1 dan masalah yang sama dengan NetInfo.fetch (). Done () - selalu mengembalikan unknown

Saya menyelesaikannya dengan cara ini:

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

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

+1

kami menemukan bug ini di 0.29.2 ..

kami menemukan bug ini di 0.28

0.30.0 masih tidak berfungsi

Kode yang relevan belum berubah jadi masuk akal jika kode itu masih tidak berfungsi.

Perhatikan bahwa saya sebelumnya melaporkan bug di sini: https://github.com/facebook/react-native/issues/8469 yang merinci penyebabnya dan memiliki kode sampel terlampir. Karena itu, menurut saya masuk akal untuk membiarkan ini ditutup.

Jumlah masalah RN terbuka bertambah setiap hari, jadi penting untuk melakukan bagian kami dan berkonsolidasi jika memungkinkan.

Saya mencatat Masalah yang sama hari ini

Saya menggunakan versi 0.30.0, dan saya juga menemukan kesalahan ini.

masalah yang sama bagi saya, saya menggunakan [email protected] dan pengambilan selalu kembali tidak diketahui.

Tapi kita bisa menggunakan addEventListener sebagai gantinya.

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

dari pada:

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

@ facebook-gub-bot bug

Saya mengalami masalah ini pada 0,31, apakah ini akan diperbaiki?

sama dengan 0,32

@knowbody Bagaimana potongan Anda bekerja? Saya perlu mendefinisikan metode setIsConnected di kelas saya atau sebagai fungsi global atau yang lainnya? Karena sebenarnya saya mengalami error yang mengatakan Can't find variable: setIsConnected

@florentsorel jadi dalam proyek saya, saya menggunakan redux untuk manajemen negara dan setIsConnected adalah pembuat tindakan saya, yang terlihat seperti:

actions/network.js

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

dan kemudian saya memiliki peredam network :

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

Saya mengalami masalah ini di v0.34.1

Edit: Diperbarui ke v0.35.0 dan masalah yang sama.

sama di v0.35.0

Saya mengalami masalah yang sama di v0.36.0

Potongan @ knowbody berfungsi untuk saya di 0,36

@Dnld : @Ehesp mengatakan bahwa ini berfungsi pada v.036, Anda dan 5 lainnya tidak? Apakah ini tidak terpecahkan pada akhirnya? Saya juga pernah mengalami masalah dengan 0,33, dan saya ingin meningkatkan. Terima kasih.

Kode yang mendasarinya belum benar-benar berubah jadi saya akan terkejut jika ini "diperbaiki".

Saya menempatkan perbaikan dalam tanda kutip karena sepertinya motivasi untuk perubahan ini adalah untuk hanya menyiapkan mesin asli yang memantau status jaringan jika kode aplikasi tertarik untuk mengamatinya.

Aplikasi menunjukkan minat dengan menambahkan pendengar acara yang kemudian mulai memeriksa jangkauan .

Pada titik ini, sepertinya ini adalah perilaku yang diinginkan, jadi mungkin diperlukan perubahan dokumentasi. NetInfo.isConnected mengembalikan boolean sehingga tidak menyatakan bahwa statusnya tidak diketahui dan itu tidak akan berubah sampai Anda menambahkan event listener. Sebagai alternatif, fungsi dapat diubah untuk mengembalikan null atau boolean.

Aplikasi saya memiliki kode yang sangat mirip dengan yang diposting oleh @knowbody . Namun, saya tidak menyebut NetInfo.isConnected.fetch() sama sekali, karena tidak berguna saat memulai.

saya berasumsi ada konektivitas, tambahkan pendengar, dan kemudian status akan diperbarui saat status konektivitas tidak lagi dikenal.

0.34.1 masih tidak berfungsi

Masalah yang sama dengan RN 0.37.0

@ xing-zheng karena alasan tertentu solusi Anda hanya mengembalikan 'MOBILE', bahkan ketika saya mematikan wifi di komputer saya, yang seharusnya tercermin di emulator saya. Tahu kenapa?

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

Masalah yang sama dengan RN 0.38.0

sama di 0,39 juga

Ketika saya mencoba solusi addEventListener, NetInfo hanya mendeteksi satu atau dua perubahan koneksi. Misalnya, jika saya mulai dengan koneksi dan kemudian melepaskannya, Netinfo akan mendeteksinya, tetapi jika saya menyambungkan kembali itu akan gagal mendeteksi bahwa saya sekarang terhubung. NetInfo menghasilkan banyak sekali positif palsu di aplikasi saya, bahkan dengan solusinya. Apakah ada orang lain yang mengalami hal yang sama?

Saya harus membuat solusi yang aneh untuk menyelesaikan ini. Untuk beberapa alasan, satu metode berfungsi di android dan yang lainnya di iOS. Perbaikan untuk ini akan bagus.

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 itu tidak berfungsi.

RN- 0,39+

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

if (Platform.OS === 'ios') {
NetInfo.isConnected.addEventListener ('change', handleFirstConnectivityChange);
} lain {
NetInfo.isConnected.fetch (). Lalu (isConnected => {
if (! sConnected) {
// lakukan tindakan
}
}

Bisakah Anda membantu saya?

@imbudhiraja apakah ini berfungsi di salah satu platform?

Tidak, itu tidak berfungsi di platform mana pun

Terima kasih
Manish Budhiraja

Pada 3 Jan 2017 20:12, "Roberto Dias" [email protected] menulis:

@imbudhiraja https://github.com/imbudhiraja melakukannya di salah satu
platform?

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/facebook/react-native/issues/8615#issuecomment-270128504 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/AVTjXHSe8OcVq8fQ5XVk8hh9XXHfHFVZks5rOl5ggaJpZM4JGaBc
.

Sepertinya ini mungkin dua masalah:

  1. isConnected.fetch tampaknya rusak di iOS - perbaikannya harus langsung. Solusi yang diposting oleh @ robertodias180 masuk akal karena ia menanyakan kode asli dengan metode lain.
  2. Kekacauan NetInfo dijelaskan oleh @Aristekrat . Ini lebih mengkhawatirkan- dapatkah seseorang membantu memberikan cara mendetail untuk mereproduksi masalah ini? Maka saya harus bisa membantu memperbaikinya.

RN 0.38.1 dan versi lebih lama, 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);

};

Awal NetInfo.isConnected.fetch().then(this._handleConnectionInfoChange); dengan benar mengambil status koneksi saat ini. Namun, perubahan selanjutnya pada status koneksi tidak direkam oleh eventListener.

Saya telah mengalami masalah ini untuk banyak versi RN sekarang.

@imbudhiraja saya akhirnya mengubah kode untuk sesuatu yang "lebih bersih". Saya memiliki util yang memiliki status koneksi jaringan saat ini. Ini berfungsi di kedua platform. Saya initializeConnection saat aplikasi terbuka dan kemudian isConnected saat saya butuhkan. Harap diperhatikan bahwa mungkin diperlukan beberapa waktu hingga NetInfo mendapatkan status koneksi saat aplikasi terbuka (terutama di android). Saya baru saja membuat penundaan sampai hasConnection !== null . Semoga membantu

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

Mencoba sesuatu yang serupa, saya terus mengalami situasi di mana eventListener tidak mendeteksinya ketika koneksi kembali (di simulator).

Muat ulang aplikasi tanpa koneksi internet => Terdeteksi
Hidupkan kembali internet => TIDAK terdeteksi

Muat ulang aplikasi dengan koneksi internet => Terdeteksi
Matikan internet => Terdeteksi
Hidupkan kembali internet => TIDAK terdeteksi

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

    }

[...]

Mencoba menghapus dan menambahkan kembali pendengar dengan setiap perubahan, tetapi tidak ada kegembiraan.

@mschipperheyn Saya mengalami masalah yang sama persis menggunakan pendekatan yang diposting oleh @knowbody sebelumnya.

Dokumen juga menyiratkan bahwa ia hanya akan menangani perubahan pertama melalui handleFirstConnectivityChange . Apakah ini benar, atau haruskah mendeteksi semua perubahan selanjutnya?

Pastikan Anda punya

setel dalam file manifes android Anda. Yang ini membuatku tersandung.

Masalah yang sama dengan RN 0.41.0

di iOS, jangan tambahkan listener dan jangan daftarkan SCNetworkReachabilitySetCallback. pasti tidak bekerja. apa tujuan desainnya?

sama dengan 0.41.2

@djohnkirby Komentar Anda tidak memiliki XML. Saya rasa Anda bermaksud mengirim - dapatkah Anda Sunting?

Baris yang akan ditambahkan kepada Anda AndroidManifest.xml adalah:

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

0.39.2: Masalah yang sama. Tidak hanya NetInfo fetch hasilnya selalu false , tetapi juga mendeteksi perubahan status koneksi dengan cepat setelah aplikasi dimulai

0.42.0: Masalah yang sama. Saya juga menjelaskan masalah saya di sini: https://stackoverflow.com/questions/42642034/check-for-internet-connection-returns-wrong-results
Saya menguji di iOS dan macOS Sierra.

PEMBARUAN : Masalah saya adalah karena pengujian pada simulator, pada perangkat nyata semuanya berfungsi. Dijawab di link di atas.

Saya memiliki masalah yang sama :(

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

Jika seseorang ingin tahu apakah aplikasi berjalan di simulator atau tidak: http://stackoverflow.com/a/34732015/552669

Itu bukan serangga. Modul asli RCTNetInfo adalah subclass dari RCTEventEmitter , jadi kita harus menambahkan pengamat untuk memicu metode startObserving .
Dalam proses peluncuran aplikasi Anda, tambahkan pengamat arbitrer ke NetInfo, lalu Anda dapat memanggil fungsi fetch . (NetInfo.isConnected memang memanggil fungsi pengambilan)

Menurut saran @ robertodias180 saya datang ke pembungkus untuk isConnected,
Tampaknya berhasil, tetapi saya bertanya-tanya apakah itu akan berhasil dalam semua kasus

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

Masalah yang sama. 0.40

Saya mengalami masalah yang sama

0.42.3 - Saya mengalami masalah yang sama saat menjalankan iOS di simulator dan perangkat sebenarnya. Menggunakan solusi dari @ Knight704 telah mengurangi masalah tersebut.

Sama dengan 0.42.3

sama pada 0.43.1

Lihat ini di 0,40

mengalami masalah ini juga. Mampu membuatnya bekerja secara acak kemudian berhenti bekerja.

Solusi @ Knight704 bekerja pada awalnya untuk saya, tetapi untuk beberapa alasan setelah saya memanggilnya sekali dari dalam lapisan kedua navigator dalam modal, fungsi berhenti bekerja (handleFirstConnectivityChangeIOS tidak pernah dipanggil), bahkan setelah saya menutup modal. Perilaku yang sangat aneh, tidak tahu mengapa ini tidak berfungsi atau jika ada hal lain dalam basis kode saya yang tidak berfungsi dengan baik dengan NetInfo.

apa yang saya lewatkan?

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

jadi ketika saya menjalankannya, itu memberi saya peringatan kadang-kadang, tidak selalu ....

ini adalah log konsol yang dikembalikan ketika memberi saya peringatan bahkan ketika ada koneksi:

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

Mengalami masalah yang sama seperti @SteffeyDev ketika saya menggunakan perbaikan dari @ Knight704 di https://github.com/facebook/react-native/issues/8615#issuecomment -287977178 Dalam kebanyakan kasus, ini berfungsi dengan baik, namun ketika saya memilikinya modals yang didorong atau dimunculkan kode yang sama tidak akan pernah menyelesaikan karena saya mengasumsikan peristiwa change sudah dipancarkan.

Saya perhatikan bahwa dalam kondisi ini, NetInfo.fetch() akan mengembalikan status unknown (ini akan memicu false bawah NetInfo.isConnected.fetch() sehingga saya dapat mengatasinya dengan modifikasi berikut ke solusi asli:

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

Kondisi unknown hanya dipicu di iOS karena Android mengembalikan UNKNOWN . Ini juga merupakan alasan untuk huruf kecil sebelum mengembalikan status karena ini akan lebih atau kurang mempertahankan perilaku yang ada dari NetInfo.isConnected.fetch .

sama di 0.44

Pada awalnya saya mengamati bahwa NetInfo hanya ingin mengembalikan perubahan status jaringan setelah satu siklus (on -> off). Ternyata hanya ada masalah itu di simulator. Pada perangkat nyata, ia mengaktifkan panggilan balik dengan benar bahkan untuk beberapa siklus penyambungan / pemutusan hubungan.

Kode sampel

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

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

Masalah ini mengganggu saya untuk sementara waktu dan saya secara tidak langsung akhirnya membuat pustaka utilitas kecil yang berfokus pada deteksi offline / online RN, yang mencakup pola React khas dan integrasi yang bagus dengan redux.

Ini berfungsi dengan baik di perangkat nyata, baik Android dan iOS. Namun, saya juga dapat menguatkan bahwa terkadang pendengar tidak terpicu di simulator iOS dan status konektivitas menjadi tidak konsisten. Saya belum mencoba solusi yang diusulkan oleh @ knight704 dan @Ignigena (di sini dan di sini masing-masing) tetapi mungkin akan segera mengujinya ketika saya punya waktu.

Humas juga sangat disambut jika lebih banyak orang yang mengonfirmasi bahwa solusi tersebut berfungsi dengan baik!

Tolong perbaiki.

Jika ini tidak mungkin segera diperbaiki, dapatkah kami setidaknya memperbarui dokumen untuk menunjukkan bahwa ini tidak berfungsi di iOS?

@ jpb12 mungkin ada baiknya membuat PR dan melihat apakah mereka menggabungkannya. Mungkin benar-benar membuat ini lebih terlihat karena sepertinya dilupakan.

Saya menghadapi masalah ini dalam versi Android. Tampaknya ini terkait dengan pergi ke latar belakang dan kembali ke latar depan. Sayangnya saya tidak dapat mereproduksi masalah ini dengan andal tetapi pasti terjadi setelah beberapa transisi latar belakang / latar depan. Apalagi jika status koneksi sudah diubah saat itu

Saat itu terjadi
NetInfo.isConnected.fetch().then(isConnected => {...}) selalu mengembalikan false
NetInfo.fetch().then((reach) => {...}) selalu mengembalikan NONE
menambahkan / menghapus pendengar tidak membantu

Saya akan sangat berterima kasih atas cara yang dapat diandalkan untuk mendeteksi status koneksi yang sebenarnya

Saya menghadapi perilaku yang aneh karena isConnected mengembalikan true saat terhubung ke wifi (sejauh ini ok) tetapi jika modem tidak terhubung ke internet, isConnected masih benar. Saya tidak begitu yakin bagaimana cara memeriksa koneksi internet secara efektif, bukan hanya koneksi jaringan. Ada ide? Terima kasih

@kodatech Modul ini akan membantu Anda mengatasi masalah itu. Saya telah menggunakannya baru-baru ini di sebuah proyek dan sangat merekomendasikannya https://github.com/rauliyohmc/react-native-offline

Terima kasih banyak @craigcoles

@ Knight704 terima kasih bro.

@craigcoles Apakah Anda memiliki kode yang berfungsi yang dapat saya ikuti?

@nmfzone Saya tidak memiliki apa pun yang dapat saya tunjukkan, tetapi ada banyak contoh kode di Readme 😃

Saya menggunakan acara pendengar Netinfo sebagai berikut, ini berfungsi dengan baik di kedua platform.
"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 Dari pengalaman saya jika aplikasi Android telah diminimalkan (di latar belakang) itu tidak bereaksi pada 'change' acara. Diuji pada Galaxy Note 5 saya, Android 7.0

Modul https://github.com/rauliyohmc/react-native-offline yang direkomendasikan di atas hanya terus melakukan ping https://google.com . Ini berfungsi tetapi saya lebih suka memperbaiki bug ini

Itu masuk akal karena aplikasi Android ditangguhkan saat berada di latar belakang. Untuk menerima acara, Anda perlu membuat layanan yang akan terus berjalan meskipun aplikasi ditangguhkan.

Atau, Anda bisa menambahkan pengendali onResume ke aplikasi dan menanyakan status offline. Itu seharusnya lebih sederhana daripada membuat dan mengelola layanan.

@ alsh76 bagi saya ini berfungsi saat aplikasi di latar belakang, tidak berfungsi saat aplikasi dimatikan dari menu multitasking.
Saya mengatasinya dengan memanggil fungsi berikut setiap kali layar beranda saya diluncurkan.
if(Platform.OS === 'android'){ NetInfo.isConnected.fetch().then(isConnected => { if(!isConnected) return; //Do something }); }

Bertemu masalah yang sama dengan perangkat virtual android. Tapi masalahnya tidak apa-apa beberapa hari yang lalu dan masih melakukannya di perangkat iOS dan emulator. Apakah seseorang menemukan cara yang stabil dan benar untuk mendapatkan status koneksi jaringan?

Terima kasih @ sumesh1993 yang melakukan trik untuk saya di iOS!
@igorarkhipenko, apakah Anda mencoba sarannya?

Hai, apakah Anda menambahkan izin misalnya android perlu menambahkan
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

hanya pembaruan kecil pada solusi oleh @ Knight704 dan @Ignigena karena NetInfo.fetch tidak digunakan lagi sekarang. Ini melakukan trik untuk saya:
``
const isNetworkConnected = () => {
kembalikan NetInfo.getConnectionInfo (). lalu (reachability => {
if (reachability.type === 'unknown') {
kembalikan Janji baru (selesaikan => {
const handleFirstConnectivityChangeIOS = isConnected => {
NetInfo.isConnected.removeEventListener ('connectionChange', handleFirstConnectivityChangeIOS);
menyelesaikan (isConnected);
};
NetInfo.isConnected.addEventListener ('connectionChange', handleFirstConnectivityChangeIOS);
});
}
return (reachability.type! == 'none' && reachability.type! == 'unknown')
});
}

Imho NetInfo.isConnected.fetch() adalah fitur penting dan harus segera diperbaiki!

@javache @sahrens @davidaurelio @janicduplessis @hramos @shergin @rigdern apakah ada jadwal untuk ini?

Terima kasih!

@pensierinmusica Ini adalah proyek berbasis komunitas, jadi saya ingin sekali mendapatkan PR yang baik.

@shergin Saya pikir React Native dibuat, dipelihara dan digunakan secara internal oleh Facebook, dan dirilis di bawah lisensi 3-klausa BSD untuk alasan ini. Jadi saya berasumsi staf Facebook akan memperbaiki bug, terutama yang penting. Anyways, senang mengetahui bahwa PR dipersilakan!

cc @

Banyak kode inti RN ditulis dan dikelola oleh komunitas.

Dan ada banyak fitur dan fungsionalitas yang tidak digunakan oleh Facebook sehingga sulit bagi kami untuk memprioritaskannya dan lebih memilih PR komunitas di mana penulis dapat memverifikasi perbaikan untuk bug / usecase mereka.

Saya juga mengalami masalah dalam bereaksi 0.47.0 dengan ios.

@pensierinmusica masalah ini pasti harus diprioritaskan. Seberapa sulit mendapatkan pengembalian boolean dari .isConnected ()?

Baiklah, inilah solusi di luar kotak yang harus melakukan trik (baik itu untuk saya). Saya mengirimkan permintaan http ke situs yang saya tahu akan aktif dan mengevaluasi tanggapannya.

Saya telah memulai repo yang seharusnya berfungsi di luar kotak. https://github.com/JamesDorrian/NetInfoCheckConnection/tree/master

Catatan: pastikan untuk mengubah variabel httpAddress dari https://www.galwaydaily.com ke yang lain (mungkin google.com) karena saya tidak dapat menjamin bahwa variabel itu akan selalu aktif. Saya harap ini membantu siapa pun yang frustrasi dengan NetInfo!

@pensierinmusica @anujsingwd

@JamesDorrian terima kasih, saya akhirnya melakukan sesuatu yang serupa, ping "google.com".

Berikut cuplikannya:

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

Namun, ini hanya solusi sementara, dan menurut saya NetInfo.isConnected harus segera diperbaiki!

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

Bisakah kita berhenti dengan komentar +1 tentang masalah ini, tolong, untuk apa reaksi digunakan.

ios:
permintaan pertama. jika server macet, ponsel memiliki wifi.
NetInfo.isConnected.fetch (). Lalu ((isConnected) => {selalu salah}
0.49.3.

@kddc solusi Anda tampaknya berfungsi dengan baik dalam pengembangan 👍

Cukup tambahkan Reachability Library ke dalam proyek XCode Anda dari Apple yang disajikan di sini , inilah solusinya.

@fuatsengul Saya telah menambahkan proyek Reachability sebagai perpustakaan di proyek Xcode saya, tetapi masalah masih belum terpecahkan, bisakah Anda menjelaskan kepada saya apa lagi yang perlu dilakukan untuk menyelesaikan masalah? Terima kasih.

Masalahnya tampaknya hanya dengan fetch api .. namun, menambahkan event listener berfungsi pada iOS .. Namun, addEventListener tidak berfungsi di android, jadi Anda perlu menggunakan fetch api :)

Berikut cuplikan saya untuk membuatnya berfungsi di kedua dunia:

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

Itu ditampilkan secara offline di iOS meskipun terhubung
RN - 0,50

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

@kddc terima kasih atas solusinya.
Saya mengalami masalah dengannya di perangkat iOS saya dan skenario adalah sebagai berikut:

  1. ios -> mode pesawat aktif
  2. melakukan pengambilan -> mendapatkan 'kesalahan jaringan', isConnected salah dan reachability.type tidak ada
  3. ios -> mode pesawat mati
  4. melakukan pengambilan -> mendapatkan 'kesalahan jaringan', isConnected salah dan reachability.type tidak ada

Sepanjang waktu aplikasi berjalan, di latar belakang saat mengubah mode pesawat.
Hanya memulai ulang aplikasi "menangkap" koneksi jaringan baru.

+1

+1

Terima kasih atas perbaikannya @ alburdette619
Jadi, ini diperbaiki dalam akan tersedia dalam versi 0.54?

@ assafb81 Saya tidak yakin, tampaknya mereka mendaratkan secara internal dan saya tidak yakin apa prosesnya, bukan?

Ketika permintaan penarikan Anda digabungkan, Facebook pertama-tama memasukkannya ke dalam repo React Native internal mereka dan menjalankan tes tambahan di antaranya. Jika berhasil, perubahan akan diekspor kembali ke repo GitHub.

Dengan melihat aktivitas pull request Anda, Anda dapat melihat komit Anda

image

Sebagai perbandingan, jika Anda melihat komit yang lebih lama, Anda dapat melihatnya muncul di sejumlah cabang:

image

Di awal setiap bulan, cabang kandidat rilis baru dibuat berdasarkan "master". Jadi perubahan Anda kemungkinan besar akan ada di kandidat rilis berikutnya di awal Maret. Anda dapat membaca lebih lanjut tentang jadwal rilis React Native di posting blog ini .

Adam Comella
Microsoft Corp.

Apakah ada yang memverifikasi masalah ini dengan RN 54 terbaru? Bagi saya ini selalu kembali 'benar' sekarang di iOS dan di Android itu berfungsi dengan baik. Adakah yang melihat masalah ini?

0,53 selalu salah .. @deepaksasken .. sepertinya saya perlu menonaktifkan kode hanya untuk android .. Tidak dapat menggunakan 0,54 untuk banyak bug.

@ alien3d Maksud Anda menonaktifkannya untuk iOS dan menyimpannya hanya untuk Android? Di Android itu berhasil?

@afilp saya hanya mengikuti contoh di atas untuk ios

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

Saya masih membutuhkan banyak pengujian sebelum dianggap stabil. sekarang menggunakan kembali 0,530

@ assafb81 Apakah Anda menemukan solusi untuk masalah mode pesawat? Saya menggunakan solusi Anda dalam 0,53.

@aflip Ketika data diaktifkan tetapi tidak ada paket tetap itu mengembalikan isConnected benar. Sudahkah Anda mencoba menyelesaikannya?

Mengapa ada removeEventListener. Seharusnya aplikasi tidak mendengarkan perubahan jaringan setiap saat. Siapa saja?

Juga mengalami masalah yang sama dengan pengguna di atas. Pemroses acara NetInfo tampaknya sangat tidak dapat diandalkan. Saya telah mencoba banyak solusi di atas tanpa hasil yang stabil. Untuk saat ini saya akan mengandalkan pengambilan https://google.com atau titik akhir kesehatan di server saya sendiri untuk memastikan pengguna saya memiliki koneksi internet.

@MichaelPintos Ini bekerja untuk saya, terima kasih.

RN 0.54.2
OS: iOS
masalah yang sama, selalu tidak diketahui

Saat Saya Upgrade RN ke 0.55.3

Saya menggunakan kode ini, pertama kembali tidak diketahui, dan kemudian berhasil

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

Oke, jadi mari kita lakukan sedikit trik.

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

Ini solusi saya. Harapkan solusi resmi.

Diupgrade ke 55 secara khusus karena changelog mengatakan itu seharusnya memperbaiki ini - masih rusak (0.55.3).

Saya bisa membuatnya berfungsi menggunakan solusi yang mirip dengan @ yuyao110120 :

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

Saya tidak lagi mempercayai NetInfo (react-native 0.53.3)
Inilah yang saya lakukan untuk memastikan ada internet:

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 Saya cukup melakukan hal yang sama pada aplikasi saya, berfungsi dengan baik. Tetapi API NetInfo harus diperbaiki haha!

@SudoPlz Saya melihat bahwa fetch menyimpan permintaan di Android. Anda harus memberinya beberapa header untuk mencegahnya.

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

Ok terima kasih telah memberi tahu saya @AbdallaMohamed Saya memperbarui komentar.

sama seperti @kylevdr , bekerja dengan andal tetapi menambahkan sedikit waktu tunggu sebelum panggilan ke-2 tampaknya membantu dengan flicker di mana itu akan terputus untuk sepersekian detik tepat setelah membuka kunci

Sunting: fwiw ini bekerja di 55.3, tapi tidak 55.4

Menambahkan pemroses peristiwa koneksi awal akan menyebabkan NetInfo.getConnectionInfo() dan NetInfo.isConnected.fetch() berfungsi dengan benar pada panggilan pertama.

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

Terima kasih # 8469

Pastikan untuk mengimpor file ini atau file tidak akan dijalankan.

PS Jika Anda menggunakan fetch , gunakan method: 'HEAD' untuk mengurangi jumlah data yang dikirim.

Tidak ada solusi di atas yang berfungsi saat menjalankan aplikasi dalam mode debug pada iPhone 8 (React Native 0.55.3, iOS 11.3.1) dalam skenario berikut: Tutup aplikasi dan mulai dengan data seluler dan wifi nonaktif.

Setiap kejadian berikutnya akan hilang dengan semua solusi yang disebutkan di atas (kecuali untuk jawaban @SudoPlz ). Hanya menjalankan aplikasi dalam mode rilis di perangkat atau dalam mode debug di simulator yang memicu peristiwa NetInfo .

@nlindroos jadi apakah Anda benar-benar mengonfirmasi bahwa NetInfo berfungsi dengan baik pada perangkat yang menjalankan versi rilis?

Dalam kasus khusus _mulai_ aplikasi dalam mode offline pada perangkat iOS fisik, menjalankan mode rilis adalah satu-satunya solusi yang berfungsi untuk memicu peristiwa NetInfo . Saya belum menguji semua skenario terkait cukup untuk menjamin ini sebagai solusi umum untuk semua masalah NetInfo .

Saya dapat mengatakan bahwa kombinasi solusi yang @woodpav dan @AbdallaMohamed berhasil untuk saya
Saya menggunakan RN versi 0.55.4

Saya harus sering melakukan ping ke server Google untuk memeriksa koneksi internet 😕

Saya menggunakan simulator iPhone 8 - 11.3 dan pada RN versi 0.55.4 NetInfo.isConnected.fetch (). Kemudian (isConnected => console.log ('isConnected', isConnected))
Selalu mengembalikan nilai salah. Ini juga merupakan masalah dalam produksi di ponsel. Saya mencoba variasi data seluler dan wifi.

Saat beralih kembali ke RN versi 0.55.3 tampaknya berfungsi kembali.

@octopitus , @martinentelect
ini adalah kode saya, saya menggunakan react native version 0.55.4, dan ini adalah solusi yang masuk akal dan bekerja sampai NetInfo diperbaiki.
Di file api.js saya, saya memiliki kode ini

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;

Dalam file App.js saya (titik masuk saya ke aplikasi), saya menambahkan pendengar acara:

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

@ assafb81 Terima kasih! Ini membantu kasus penggunaan saya.

Dalam kasus saya, pendengar acara berfungsi dengan sempurna di iOS tetapi tidak sama sekali di Android (setidaknya di emulator).
Apakah ada solusi untuk pendengar di Android saat masih menggunakan NetInfo?

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

Menggunakan


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

@rumahsakitotak ,
periksa perangkat android asli dan bukan emulator

Pada 0.55.4 ini masih bug, dan saya baru saja mendapat hit pada produksi 😢

Masih belum terpaku pada 0,56

@SudoPlz Saya menyembunyikan komentar Anda di utas diskusi 0,57 sebagai di luar topik. Seperti yang Anda ketahui, ada ratusan masalah terbuka di repo, tetapi utas itu difokuskan untuk mengeluarkan rilis 0,57.

Utas pada penutupan ini hampir tidak terlihat oleh pengelola, dan saya terkejut bahwa enam bulan setelah perbaikan potensial dilakukan, tidak ada yang membuka masalah baru. Jika ini adalah sesuatu yang ingin Anda lihat diperbaiki di master, silakan buka masalah baru dengan detail, dan idealnya, kirim PR.

Berikut adalah contoh minimal yang dapat direproduksi (diuji pada perangkat iOS), dengan beberapa kode dari @woodpav yang dibagikan di atas untuk mengatasi masalah yang dikomentari di bagian atas: https://snack.expo.io/@notbrent/netinfo -repro.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat