React-native: iOSNetInfo.isConnectedは垞にfalseを返したす

䜜成日 2016幎07月06日  Â·  139コメント  Â·  ゜ヌス: facebook/react-native

私は珟圚RN0.28.0を実行しおいたす...

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

PRをしたすが、iOS甚にコヌディングできたせん。

Help Wanted iOS Locked

最も参考になるコメント

@ robertodias180の提案によるず、私はisConnectedのラッパヌを思い぀いた。
うたくいくようですが、すべおの堎合にうたくいくのだろうか

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

党おのコメント139件

これはRN0.29.0でも再珟できたす。 以前は0.26.2で実行しおいたしたが、問題なく動䜜したした。 ゜ヌスからビルドしおデバッグしおみたす。

+1

以前に同じ問題を報告したした https 

簡単な回避策は、むベントハンドラヌNetInfo.isConnected.addEventListener('change', Function.prototype)を远加するこずです。

+1ずNetInfo.fetch。doneの同じ問題-垞にunknown返したす

私はそれをこのように解決したした

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

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

+1

このバグは0.29.2で芋぀かりたした。

このバグは0.28で芋぀かりたした

0.30.0がただ機胜しない

関連するコヌドは倉曎されおいないため、ただ機胜しおいないこずは理にかなっおいたす。

以前にここでバグを報告したこずに泚意しおください //github.com/facebook/react-native/issues/8469ここでは、原因の詳现ずサンプルコヌドが添付されおいたす。 このため、これを閉じたたたにしおおくのは理にかなっおいるず思いたす。

未解決のRNの問題の数は日々増加しおいるため、私たちの圹割を果たし、可胜な堎合は統合するこずが重芁です。

私は今日同じ問題に気づきたした

0.30.0バヌゞョンを䜿甚しおいたすが、この゚ラヌも芋぀かりたした。

同じ問題ですが、 RN @ 0.30.0を䜿甚しおいたすが、フェッチは垞に䞍明を返したす。

ただし、代わりにaddEventListenerを䜿甚できたす。

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

の代わりに

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

@ facebook-github-botのバグ

0.31でこの問題が発生しおいたすが、修正されたすか

0.32ず同じ

@knowbodyスニペットはどのように機胜したすか クラスで、たたはグロヌバル関数ずしお、たたは他の䜕かずしおsetIsConnectedメ゜ッドを定矩する必芁がありたすか なぜなら、実際にはCan't find variable: setIsConnectedず蚀った゚ラヌがありたす

@florentsorelなので、私のプロゞェクトでは状態管理にreduxを䜿甚し、 setIsConnectedはアクションクリ゚ヌタヌです。これは次のようになりたす。

actions/network.js

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

そしお、私は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

v0.34.1でこの問題が発生しおいたす

線集v0.35.0に曎新し、同じ問題。

v0.35.0でも同じ

v0.36.0でも同じ問題が発生しおいたす

@knowbodyスニペットは0.36で動䜜したす

@Dnld  @Ehespは、

基になるコヌドは実際には倉曎されおいないので、これが「修正」されおいるずしたら驚きたす。

この倉曎の動機は、アプリケヌションコヌドがネットワヌクステヌタスの監芖に関心がある堎合にのみ、ネットワヌクステヌタスを監芖するネむティブの機械を蚭定するこずであるず思われるため、修正を匕甚笊で囲みたす。

アプリは、到達可胜性のチェックをむベントリスナヌを、関心を登録したす。

この時点では、これが望たしい動䜜であるように思われるため、おそらくドキュメントの倉曎が必芁です。 NetInfo.isConnectedはブヌル倀を返すため、状態が䞍明であり、むベントリスナヌを远加するたで状態が倉曎されないこずを衚したせん。 たたは、関数を倉曎しおnullたたはブヌル倀を返すこずもできたす。

私のアプリには、 @ knowbodyが投皿したものず非垞によく䌌たコヌドがありたす。 ただし、起動時には圹に立たないので、 NetInfo.isConnected.fetch()はたったく呌び出したせん。

接続があるず仮定し、リスナヌを远加するず、接続状態が䞍明でなくなったずきに状態が曎新されたす。

0.34.1がただ機胜しない

RN0.37.0ず同じ問題

@ xing-zheng䜕らかの理由で、コンピュヌタヌのWi-Fiをオフにしおも、゜リュヌションは「MOBILE」のみを返したす。これぱミュレヌタヌに反映されたす。 理由は䜕ですか

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

RN0.38.0ず同じ問題

0.39でも同じ

addEventListener゜リュヌションを詊しおみるず、NetInfoは1぀たたは2぀の接続倉曎のみを怜出したす。 たずえば、接続を開始しおからドロップするず、Netinfoはそれを怜出したすが、再接続するず、接続されおいるこずを怜出できたせん。 NetInfoは、回避策があっおも、私のアプリで非垞に倚くの誀怜知を生成しおいたす。 他の誰かが同じこずを経隓しおいたすか

これを解決するには、奇劙な回避策を䜜成する必芁がありたした。 䜕らかの理由で、䞀方の方法はAndroidで機胜し、もう䞀方の方法はiOSで機胜したす。 これに察する修正は玠晎らしいでしょう。

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それは機胜しおいたせん。

RN- 0.39 +

関数handleFirstConnectivityChangeisConnected{
ifsConnected{
//アクションを実行したす
}
NetInfo.isConnected.removeEventListener 'change'、handleFirstConnectivityChange;
}

ifPlatform.OS === 'ios'{
NetInfo.isConnected.addEventListener 'change'、handleFirstConnectivityChange;
} そうしないず {
NetInfo.isConnected.fetch。thenisConnected => {
ifsConnected{
//アクションを実行したす
}
}

手䌝っおくれたせんか。

@imbudhirajaどのプラットフォヌムでも動䜜したすか

いいえ、どのプラットフォヌムでも機胜しおいたせんでした

ありがずう
マニッシュブディラゞャ

2017幎1月3日午埌8時12分、「RobertoDias」 [email protected]は次のように曞いおいたす。

@imbudhiraja https://github.com/imbudhirajaは、
プラットフォヌム

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/facebook/react-native/issues/8615#issuecomment-270128504 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AVTjXHSe8OcVq8fQ5XVk8hh9XXHfHFVZks5rOl5ggaJpZM4JGaBc
。

これには2぀の問題があるようです。

  1. isConnected.fetchはiOSで壊れおいるようです-修正は簡単なはずです。 @ robertodias180によっお投皿された回避策は、別のメ゜ッドでネむティブコヌドをク゚リするため、理にかなっおいたす。
  2. NetInfo flakynessは@Aristekratで説明したした。 これはもっず心配です-誰かがこの問題を再珟するための詳现な方法を提䟛するのを手䌝っおくれるでしょうか その埌、私はそれを修正するのを手䌝うこずができるはずです。

RN 0.38.1以前、iOSシミュレヌタ。

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

};

最初のNetInfo.isConnected.fetch().then(this._handleConnectionInfoChange);は、珟圚の接続ステヌタスを正しく取埗したす。 ただし、接続ステヌタスぞのその埌の倉曎は、eventListenerによっおキャプチャされたせん。

私は珟圚、倚くのRNバヌゞョンでこの問題を抱えおいたす。

@imbudhiraja私は結局「よりクリヌンな」もののコヌドを倉曎したした。 ネットワヌク接続の珟圚の状態を持぀ナヌティリティがありたす。 これは䞡方のプラットフォヌムで機胜しおいたす。 アプリが開いたらinitializeConnection 、必芁なずきはisConnectedです。 アプリを開いたずきにNetInfoが接続ステヌタスを取埗するたでに時間がかかる堎合があるこずに泚意しおください特にAndroidの堎合。 hasConnection !== nullたで延期したした。 それが圹に立おば幞い

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

同様のこずを詊みたしたが、接続がシミュレヌタヌで戻ったずきにeventListenerがそれを怜出しないずいう状況に遭遇し続けたす。

むンタヌネットに接続せずにアプリをリロヌド=>怜出
むンタヌネットをオンに戻す=>怜出されない

むンタヌネット接続でアプリをリロヌド=>怜出
むンタヌネットをオフにする=>怜出された
むンタヌネットをオンに戻す=>怜出されない

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

    }

[...]

倉曎のたびにリスナヌを削陀しお再床远加しようずしたしたが、喜びはありたせんでした。

@mschipperheyn @knowbodyが以前に投皿したアプロヌチを䜿甚しお、たったく同じ問題が発生しおいたす。

ドキュメントは、 handleFirstConnectivityChange介した最初の倉曎のみを凊理するこずも瀺唆しおいたす。 これは正しいですか、それずもその埌のすべおの倉曎を怜出する必芁がありたすか

あなたが持っおいるこずを確認しおください

Androidマニフェストファむルに蚭定したす。 これは私を぀たずかせた。

RN0.41.0ず同じ問題

iOSでは、リスナヌを远加せず、SCNetworkReachabilitySetCallbackを登録したせん。 確かに機胜しおいたせん。 蚭蚈目的は䜕ですか

0.41.2ず同じ

@djohnkirbyコメントに投皿する

AndroidManifest.xmlに远加する行は次のずおりです。

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

0.39.2同じ問題。 NetInfo fetch結果は垞にfalseであるだけでなく、アプリの起動埌すぐに接続ステヌタスの倉化を怜出したす

0.42.0同じ問題。 私はここで私の問題に぀いおも説明したした https 
iOSずmacOSSierraでテストしおいたす。

曎新私の問題は、シミュレヌタヌでのテストが原因でした。実際のデバむスでは、すべおが機胜しおいたす。 䞊蚘のリンクで回答したした。

私は同じ問題を抱えおいたす:(

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

アプリがシミュレヌタヌで実行されおいるかどうかを誰かが知りたい堎合 http 

バグではありたせん。 ネむティブモゞュヌルRCTNetInfoはRCTEventEmitterサブクラスであるため、 startObservingメ゜ッドをトリガヌするオブザヌバヌを远加する必芁がありたす。
アプリの起動プロセスで、任意のオブザヌバヌをNetInfoに远加するず、 fetch関数を呌び出すこずができたすNetInfo.isConnectedは実際にフェッチ関数を呌び出したす

@ robertodias180の提案によるず、私はisConnectedのラッパヌを思い぀いた。
うたくいくようですが、すべおの堎合にうたくいくのだろうか

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

同じ問題。 0.40

同じ問題が発生しおいたす

0.42.3-シミュレヌタず実際のデバむスの䞡方でiOSを実行するず同じ問題が発生したした。 @ Knight704の゜リュヌションを䜿甚するず、問題が軜枛されたした。

0.42.3でも同じ

0.43.1でも同じ

0.40でこれを芋る

この問題もありたす。 ランダムに動䜜させるこずができた埌、動䜜を停止したした。

@ Knight704の゜リュヌションは最初は機胜したしたが、䜕らかの理由で、モヌダルのナビゲヌタヌの2番目のレむダヌ内から䞀床呌び出すず、モヌダルを閉じた埌でも関数が機胜しなくなりたすhandleFirstConnectivityChangeIOSは呌び出されたせん。 非垞に奇劙な動䜜です。これが機胜しない理由や、コヌドベヌス内でNetInfoでうたく機胜しおいないものであるかどうかはわかりたせん。

私は䜕が欠けおいたすか

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

だから私がそれを実行するず、それは私に時々、垞にではない譊告を䞎えたす....

これらは、接続がある堎合でもアラヌトを衚瀺したずきに返されるコン゜ヌルログです。

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

私は、@ Knight704から修正プログラムを䜿甚する堎合@SteffeyDevず同じ問題が発生しおhttps://github.com/facebook/react-native/issues/8615#issuecommentほずんどの堎合-287977178、これは私が持っおいるしかしずき、うたく動䜜したすプッシュたたはポップされたモヌダルは、 changeむベントがすでに発行されおいるず想定しおいるため、同じコヌドが解決されるこずはありたせん。

これらの条件䞋で、 NetInfo.fetch()がunknown状態を返すこずに気付きたしたこれにより、 false䞋でNetInfo.isConnected.fetch() falseがトリガヌされるため、回避できたした。元の回避策に次の倉曎を加えたす。

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

AndroidはUNKNOWN返すため、 unknown条件はiOSでのみトリガヌされたす。 これは、ステヌタスを返す前に小文字にする理由でもありたす。これは、 NetInfo.isConnected.fetchからの既存の動䜜を倚かれ少なかれ保持するはずだからです。

0.44でも同じ

最初、NetInfoは1サむクルオン->オフ埌にのみネットワヌクステヌタスの倉曎を返したいこずに気づきたした。 シミュレヌタヌでのみその問題があるこずが刀明したした。 実際のデバむスでは、耇数の接続/切断サむクルでもコヌルバックを適切に起動したす。

サンプルコヌド

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

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

この問題はしばらくの間私を悩たせ、私は間接的にRNオフラむン/オンラむン怜出に焊点を圓おた小さなナヌティリティラむブラリを䜜成したした。これには兞型的なReactパタヌンずreduxずの玠晎らしい統合が含たれおいたす。

AndroidずiOSの䞡方の実際のデバむスで正しく動䜜したす。 ただし、iOSシミュレヌタヌでリスナヌがトリガヌされず、接続状態が䞍敎合になる堎合があるこずを確認するこずもできたす。 @ knight704ず@Ignigena それぞれここずここによっお提案された゜リュヌションはただ詊しおいたせんが、時間があればすぐにテストする予定です。

これらの゜リュヌションが魅力のように機胜するこずを確認する人が増えた堎合にも、PRは倧歓迎です

修正しおください。

これがすぐに修正される可胜性が䜎い堎合は、少なくずもドキュメントを曎新しお、これがiOSで機胜しないこずを瀺すこずができたすか

@ jpb12 PRを䜜成しお、それらがマヌゞされるかどうかを確認する䟡倀があるかもしれたせん。 それが忘れられおいるように芋えるので、実際にこれをより目に芋えるようにするかもしれたせん。

私はAndroidバヌゞョンでこの問題に盎面しおいたす。 バックグラりンドに移動しおフォアグラりンドに戻るこずに関連しおいるようです。 残念ながら、この問題を確実に再珟するこずはできたせんが、いく぀かのバックグラりンド/フォアグラりンド遷移の埌に確実に発生したす。 特にその時に接続状態が倉曎された堎合

それが起こったずき
NetInfo.isConnected.fetch().then(isConnected => {...})垞にfalse返したす
NetInfo.fetch().then((reach) => {...})垞にNONE返したす
リスナヌの远加/削陀は圹に立ちたせん

実際の接続ステヌタスを怜出するための信頌できる方法があれば非垞にありがたいです

Wi-Fiに接続するずisConnectedがtrueを返すためこれたでのずころ問題ありたせん、奇劙な動䜜に盎面しおいたすが、モデムがむンタヌネットに到達しない堎合でも、isConnectedはtrueです。 ネットワヌク接続だけでなく、むンタヌネット接続を効果的にチェックする方法がよくわかりたせん。 䜕か案は ありがずう

@kodatechこのモゞュヌルは、その問題の解決に圹立぀はずです。 最近プロゞェクトで䜿甚したしたが、 https//github.com/rauliyohmc/react-native-offlineを匷くお勧めし

@craigcolesに感謝し

@ Knight704ありがずう仲間。

@craigcoles私が埓うこずができる実甚的なコヌドはありたすか

@nmfzone衚瀺できるものはありたせんが、 Readmeにはたくさんのコヌド䟋がありたす😃

私は次のようにNetinfoリスナヌむベントを䜿甚しおいたす。䞡方のプラットフォヌムでうたく機胜したす。
"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私の経隓から、Androidアプリがバックグラりンドで最小化されおいる堎合、 'change'むベントに反応したせん。 Galaxy Note 5、Android7.0でテスト枈み

䞊蚘で掚奚されたモゞュヌルhttps://github.com/rauliyohmc/react-native-offlineは、 https://google.com継続的にpingしたす。 動䜜したすが、このバグを修正したいず思いたす

Androidアプリはバックグラりンドで䞭断されるため、これは理にかなっおいたす。 むベントを受信するには、アプリが䞀時停止されおいる間も実行を継続するサヌビスを䜜成する必芁がありたす。

たたは、 onResumeハンドラヌをアプリに远加しお、オフラむンステヌタスをク゚リするこずもできたす。 これは、サヌビスを䜜成および管理するよりも簡単なはずです。

@ alsh76私にずっおは、アプリがバックグラりンドにあるずきに機胜したすが、マルチタスクメニュヌからアプリを
ホヌム画面が起動するたびに次の関数を呌び出すこずで解決したした。
if(Platform.OS === 'android'){ NetInfo.isConnected.fetch().then(isConnected => { if(!isConnected) return; //Do something }); }

Android仮想デバむスで同じ問題に遭遇したした。 しかし、問題は、数日前は問題なく、iOSデバむスず゚ミュレヌタヌでも問題がなかったずいうこずです。 誰かがネットワヌク接続ステヌタスを取埗するための安定した正しい方法を芋぀けたしたか

iOSで私のためにトリックをしおくれた@ sumesh1993に感謝したす
@igorarkhipenko圌の提案を詊したしたか

こんにちはあなたは蚱可を远加したしたか䟋えばアンドロむドは远加する必芁がありたす
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

NetInfo.fetchが非掚奚になったため、 @ Knight704ず@Ignigenaによる゜リュヌションのほんの少しの曎新。 これは私にずっおトリックでした
`` `
const isNetworkConnected ==> {
NetInfo.getConnectionInfo。thenreachability => {を返す
ifreachability.type === '䞍明'{
新しいPromiseresolve => {を返す
const handleFirstConnectivityChangeIOS = isConnected => {
NetInfo.isConnected.removeEventListener 'connectionChange'、handleFirstConnectivityChangeIOS;
resolveisConnected;
};
NetInfo.isConnected.addEventListener 'connectionChange'、handleFirstConnectivityChangeIOS;
};
}
returnreachability.type== 'none' && Reachability.type== 'unknown'
};
}

Imho NetInfo.isConnected.fetch()は重芁な機胜であり、できるだけ早く修正する必芁がありたす。

@javache @sahrens @davidaurelio @janicduplessis @hramos @shergin @rigdernこれにタむムラむンはありたすか

THX

@pensierinmusicaこれはコミュニティ䞻導のプロゞェクトなので、良いPRをしたいず思いたす。

@shergin React Nativeは、Facebookによっお内郚的に䜜成、保守、䜿甚されおおり、この理由から

cc @rigdern

RNコアコヌドの倚くは、コミュニティによっお䜜成および保守されおいたす。

たた、Facebookで䜿甚されおいない機胜が倚数あるため、それらに優先順䜍を付けお、䜜成者がバグ/ナヌスケヌスの修正を確認できるコミュニティPRを優先するこずは困難です。

たた、iOSずのreact0.47.0で問題が発生しおいたす。

@pensierinmusicaこの問題は間違いなく優先されるべきです。 .isConnectedからブヌル倀を返すこずはどれほど難しいでしょうか

さお、これがトリックを実行するはずのすぐに䜿える回避策です私にずっおはそうです。 アクティブになるこずがわかっおいるサむトにhttpリク゚ストを送信し、応答を評䟡したす。

箱から出しおすぐに機胜するレポを初期化したした。 https://github.com/JamesDorrian/NetInfoCheckConnection/tree/master

泚httpAddress倉数をhttps://www.galwaydaily.comから別の倉数おそらくgoogle.comに倉曎しお

@pensierinmusica @anujsinghwd

@JamesDorrianありがずう、私は「google.com」にpingを実行しお、同様のこずをするこずになりたした。

スニペットは次のずおりです。

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

それでも、これは䞀時的な回避策であり、 NetInfo.isConnectedはできるだけ早く修正する必芁があるず思いたす。

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

この問題に関する+1コメントで停止できたすかこれがリアクションの甚途です。

ios
最初のリク゚スト。 サヌバヌがクラッシュした堎合、電話にはWi-Fiがありたす。
NetInfo.isConnected.fetch。thenisConnected=> {垞にfalse}
0.49.3。

@kddcあなたの゜リュヌションは開発でうたく機胜しおいるようです👍

ここで提䟛されおいるAppleのXCodeプロゞェクトにReachabilityLibraryを远加するだけで、それが解決策になりたす。

@fuatsengul XcodeプロゞェクトのラむブラリずしおReachabilityプロゞェクトを远加したしたが、それでも問題は解決しおいたせん。問題を解決するために他に䜕をする必芁があるかを簡単に説明しおください。 ありがずう。

問題はフェッチAPIでのみ発生するようです。ただし、むベントリスナヌの远加はiOSたす。ただし、addEventListenerはAndroidでは機胜しないため、フェッチAPIを䜿甚する必芁がありたす:)

これが䞡方の䞖界で機胜するようにするための私のスニペットです

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

接続されおいおも、IOSでオフラむンで衚瀺されたす
RN-0.50

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

@kddc回避策をありがずう。
iOSデバむスで問題が発生しおいたす。シナリオは次のずおりです。

  1. iOS->機内モヌドがオンになっおいる
  2. フェッチを実行->「ネットワヌク゚ラヌ」を取埗、isConnectedはfalse 、reachability.typeはnone
  3. iOS->機内モヌドがオフです
  4. フェッチを実行->「ネットワヌク゚ラヌ」を取埗、isConnectedはfalse 、reachability.typeはnone

機内モヌドを倉曎しおいる間、バックグラりンドでアプリケヌションが実行されおいる間䞭。
アプリを再起動するだけで、新しいネットワヌク接続が「キャッチ」されたす。

+1

+1

修正しおくれおありがずう@ alburdette619
だから、これは修正され、バヌゞョン0.54で利甚可胜になりたすか

@ assafb81よくわかりたせん、どうやら圌らはそれを内郚に着陞させおいるようです、そしお私はそのためのプロセスが䜕であるか

プルリク゚ストがマヌゞされるず、Facebookは最初にそれを内郚のReact Nativeリポゞトリに組み蟌み、特に远加のテストを実行したす。 それが成功するず、倉曎はGitHubリポゞトリに゚クスポヌトされたす。

プルリク゚ストのアクティビティを確認するず、

image

比范のために、叀いコミットを芋るず、いく぀かのブランチに衚瀺されおいるこずがわかりたす。

image

毎月初めに、「マスタヌ」に基づいお新しいリリヌス候補ブランチが䜜成されたす。 したがっお、倉曎は3月の初めに次のリリヌス候補になる可胜性がありたす。 React Nativeのリリヌススケゞュヌルの詳现に぀いおは、このブログ投皿をご芧ください。

アダムコメラ
Microsoft Corp.

誰かが最新のRN54でこの問題を確認したしたか 私にずっおは、iOSずAndroidでは垞に「true」が返されたすが、完党に正垞に機胜したす。 この問題を芋おいる人は他にいたすか

0.53垞にfalse .. @deepaksasken ..androidのコヌドのみを無効にする必芁があるようです..倚くのバグに察しお0.54を䜿甚できたせん。

@ alien3d iOSで無効にし、Androidでのみ保持するずいう意味ですか Androidでは動䜜したすか

@afilp私は

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

安定しおいるず芋なす前に、ただ倚くのテストが必芁です。 珟圚は0.530を䜿甚しおいたす

@ assafb81機内モヌドの問題の解決策を芋぀けたしたか 0.53であなたの゜リュヌションを䜿甚しおいたす。

@aflipデヌタが有効になっおいるが、パッケヌゞがただない堎合、isConnectedtrueを返したす。 あなたはそれを解決しようずしたしたか

removeEventListenerがあるのはなぜですか。 アプリは垞にネットワヌクの倉曎をリッスンするべきではありたせん。 誰でも

䞊蚘のナヌザヌず同じ問題もありたす。 NetInfoむベントリスナヌは非垞に信頌性が䜎いようです。 䞊蚘の回避策の倚くを詊したしたが、安定した結果は埗られたせんでした。 今のずころ、ナヌザヌがむンタヌネットに接続しおいるこずを確認するために、 https//google.comたたは自分のサヌバヌ䞊のヘルス゚ンドポむントを取埗するこずに䟝存したす。

@MichaelPintosそれは私のために働きたす、ありがずう。

RN 0.54.2
OSiOS
同じ問題、垞に䞍明

RNを0.55.3にアップグレヌドするず

私はこのコヌドを䜿甚しおいたす、最初に䞍明を返し、それからそれは機胜したす

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

では、ちょっずしたトリックをしたしょう。

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

これが私の解決策です。 公匏の解決策を期埅しおください。

特に倉曎ログがこれを修正するこずになっおいるず蚀ったので55にアップグレヌドしたした-ただ壊れおいたす0.55.3。

@ yuyao110120ず同様の゜リュヌションを䜿甚しお、それを機胜させるこずができ

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

NetInfo信甚しなくなったreact-native 0.53.3
これは私がむンタヌネットがあるこずを確認するために行うこずです

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私は自分のアプリでかなり同じこずをしたしたが、問題なく動䜜したす。 しかし、 NetInfo APIは修正する必芁がありたす。

@SudoPlz fetchがAndroidでリク゚ストをキャッシュしおいるこずに気づきたした。 それを防ぐために、いく぀かのヘッダヌを付ける必芁がありたす。

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

@AbdallaMohamedを知らせおくれお

@kylevdrず同じように、確実に機胜したしたが、2回目の呌び出しの前に小さなタむムアりトを远加するず、ロックを解陀した盎埌に2回目の分割で切断されるちら぀きに圹立぀ようです。

線集fwiwこれは55.3で機胜したすが、55.4では機胜したせん

最初の接続むベントリスナヌを远加するず、最初の呌び出しでNetInfo.getConnectionInfo()ずNetInfo.isConnected.fetch()が正しく機胜したす。

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

ありがずう8469

必ずこのファむルをむンポヌトしおください。むンポヌトしないず実行されたせん。

PS fetchを䜿甚しおいる堎合は、 method: 'HEAD'を䜿甚しお、送信されるデヌタの量を枛らしたす。

次のシナリオでiPhone8React Native 0.55.3、iOS 11.3.1でデバッグモヌドでアプリを実行するず、䞊蚘の゜リュヌションはいずれも機胜したせんでした。アプリを閉じお、モバむルデヌタずWi-Fiをオフにしお起動したす。

䞊蚘のすべおの゜リュヌションでは、埌続のむベントはすべお倱われたす @SudoPlzの回答を陀く。 デバむスでリリヌスモヌドたたはシミュレヌタヌでデバッグモヌドでのみアプリケヌションを実行するず、 NetInfoむベントがトリガヌされたした。

@nlindroosでは、リリヌスバヌゞョンを実行するデバむスでNetInfo正垞に機胜するこずを実際に確認したすか

物理iOSデバむスでオフラむンモヌドでアプリケヌションを「起動」する特定のケヌスでは、リリヌスモヌドで実行するこずが、 NetInfoむベントをトリガヌするための唯䞀の有効な゜リュヌションNetInfo問題の䞀般的な解決策ずしおこれを保蚌するのに十分な、関連するすべおのシナリオをテストしおいたせん。

@woodpavず@AbdallaMohamedが私のために働いた゜リュヌションの組み合わせず蚀えたす
RNバヌゞョン0.55.4を䜿甚しおいたす

むンタヌネット接続を確認するためにGoogleサヌバヌに頻繁にpingを実行する必芁がありたす😕

私はiPhone8-11.3シミュレヌタヌを䜿甚しおおり、RNバヌゞョン0.55.4ではNetInfo.isConnected.fetch。thenisConnected => console.log 'isConnected'、isConnected
垞にfalseを返したす。 これは電話での制䜜でも問題です。 モバむルデヌタずwifiのバリ゚ヌションを詊しおみたした。

RNバヌゞョン0.55.3に戻すず、再び機胜しおいるようです。

@ octopitus 、@ martinentelect
これは私のコヌドです。私はreactNativeバヌゞョン0.55.4を䜿甚しおおり、 NetInfoが修正されるたでは賢明で回避策がありたす。
私のapi.jsファむルにはこのコヌドがありたす

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;

App.jsファむルアプリケヌションぞの゚ントリポむントに、むベントリスナヌを远加したす。

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

@ assafb81ありがずうございたす これは私のナヌスケヌスに圹立ちたした。

私の堎合、むベントリスナヌはiOSで完党に機胜したすが、Androidではたったく機胜したせん少なくずも゚ミュレヌタヌでは。
NetInfoを䜿甚しおいるずきにAndroidのリスナヌに回避策はありたすか

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

䜿甚する


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 、
゚ミュレヌタではなく実際のAndroidデバむスを確認しおください

0.55.4これはただバグであり、本番環境でヒットしたした😢

0.56ではただ修正されおいたせん

@ SudoPlz0.57ディスカッションスレッドぞのコメントをトピック倖ずしお非衚瀺にしたした。 ご存知のように、リポゞトリには䜕癟もの未解決の問題がありたすが、そのスレッドは0.57リリヌスを出すこずに焊点を圓おおいたす。

クロヌズされたこのスレッドは、メンテナにはほずんど芋えたせん。朜圚的な修正が行われおから6か月埌、誰も新しい問題を開いおいないこずに驚いおいたす。 これがマスタヌで修正しおほしいものである堎合は、詳现を蚘茉した新しい問題を開いおください。理想的には、PRを送信しおください。

これは最小限の再珟可胜な䟋iOSデバむスでテスト枈みです。 @ woodpavのコヌドをたす

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡