React-native: iOS : NetInfo.isConnected๋Š” ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 07์›” 06์ผ  ยท  139์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/react-native

ํ˜„์žฌ RN 0.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 ๋Œ“๊ธ€

RN 0.29.0์œผ๋กœ๋„ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” 0.26.2 ์ด์ „์— ์‹คํ–‰ ์ค‘์ด์—ˆ๊ณ  ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค์—์„œ ๋นŒ๋“œํ•˜๊ณ  ๋””๋ฒ„๊ทธํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

+1

์ด์ „์— ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/facebook/react-native/issues/8469

๋น ๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ธฐ 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์ด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

๊ด€๋ จ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด์ „์— https://github.com/facebook/react-native/issues/8469 ์—์„œ ๋ฒ„๊ทธ๋ฅผ๋ณด๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์›์ธ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ์ƒ˜ํ”Œ ์ฝ”๋“œ๊ฐ€ ์ฒจ๋ถ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋‹ซ์•„ ๋‘๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ด๋ฆฐ RN ๋ฌธ์ œ์˜ ์ˆ˜๊ฐ€ ๋งค์ผ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ์šฐ๋ฆฌ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„ ๊ฐ™์€ ๋ฌธ์ œ์— ์ฃผ๋ชฉํ–ˆ์Šต๋‹ˆ๋‹ค

0.30.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ์ด ์˜ค๋ฅ˜๋„ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๊ฐ™์€ ๋ฌธ์ œ, ๋‚˜๋Š” [email protected]์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ€์ ธ ์˜ค๊ธฐ๋Š” ํ•ญ์ƒ ์•Œ ์ˆ˜ ์—†์Œ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋Œ€์‹  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 ๋Š” v.036์—์„œ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฒฐ๊ตญ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? 0.33์—์„œ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ.

๊ธฐ๋ณธ ์ฝ”๋“œ๋Š” ์‹ค์ œ๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด "๊ณ ์ •"๋˜๋ฉด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ณ€๊ฒฝ์˜ ๋™๊ธฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€์ด๋ฅผ ๊ด€์ฐฐํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋”ฐ์˜ดํ‘œ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ฑ ์€ ๋„๋‹ฌ ๊ฐ€๋Šฅ์„ฑ ํ™•์ธ ์„ ํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ฅผ

์ด ์‹œ์ ์—์„œ ์ด๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ๋™์ž‘ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋ฌธ์„œ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NetInfo.isConnected ๋Š” ๋ถ€์šธ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฉฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ ํ•  ๋•Œ๊นŒ์ง€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜๋Š” null ๋˜๋Š” ๋ถ€์šธ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์•ฑ์—๋Š” @knowbody๊ฐ€ ๊ฒŒ์‹œ ํ•œ ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ์ž‘ํ•  ๋•Œ ์“ธ๋ชจ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— NetInfo.isConnected.fetch() ๋ผ๊ณ  ์ „ํ˜€ ๋ถ€๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ ๋” ์ด์ƒ ์•Œ ์ˆ˜ ์—†์„ ๋•Œ ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

0.34.1์ด ์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

RN 0.37.0๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ

@ xing-zheng ์–ด๋–ค ์ด์œ ๋กœ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ Wi-Fi๋ฅผ ๋„๋”๋ผ๋„ ์†”๋ฃจ์…˜์ด 'MOBILE'๋งŒ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿฐ์ง€ ์•„์„ธ์š”?

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

RN 0.38.0๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ

0.39์—์„œ๋„ ๋™์ผ

addEventListener ์†”๋ฃจ์…˜์„ ์‹œ๋„ ํ•  ๋•Œ NetInfo๋Š” ํ•˜๋‚˜ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ์—ฐ๊ฒฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋งŒ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฐ๊ฒฐ๋กœ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์—ฐ๊ฒฐ์„ ๋Š์œผ๋ฉด 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 ์ด์ƒ

function handleFirstConnectivityChange (isConnected) {
if (! sConnected) {
// ์กฐ์น˜ ์ˆ˜ํ–‰
}
NetInfo.isConnected.removeEventListener ( 'change', handleFirstConnectivityChange);
}

if (Platform.OS === 'ios') {
NetInfo.isConnected.addEventListener ( 'change', handleFirstConnectivityChange);
} else {
NetInfo.isConnected.fetch (). then (isConnected => {
if (! sConnected) {
// ์กฐ์น˜ ์ˆ˜ํ–‰
}
}

์ € ์ข€ ๋„์™€ ์ฃผ ์‹œ๊ฒ ์–ด์š”?

@imbudhiraja ๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š” ์–ด๋–ค ํ”Œ๋žซํผ์—์„œ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ
๋งค๋‹ˆ์‰ฌ ๋ถ€๋”” ๋ผ์ž

2017 ๋…„ 1 ์›” 3 ์ผ ์˜คํ›„ 8์‹œ 12 ๋ถ„์— "Roberto Dias" [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
.

๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  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 ๋ฅผํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์—ด๋ฆด ๋•Œ (ํŠนํžˆ Android์—์„œ) NetInfo ์— ์—ฐ๊ฒฐ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ ๋  ๋•Œ๊นŒ์ง€ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 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 ๋ฅผ ํ†ตํ•ด ์ฒซ ๋ฒˆ์งธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋งŒ ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋ชจ๋“  ํ›„์† ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค

์•ˆ๋“œ๋กœ์ด๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์— ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ๋„˜์–ด ๋œจ๋ ธ๋‹ค.

RN 0.41.0๊ณผ ๋™์ผํ•œ ๋ฌธ์ œ

iOS์—์„œ๋Š” ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  SCNetworkReachabilitySetCallback์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ๋ชฉ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

0.41.2์™€ ๋™์ผ

@djohnkirby ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— XML์ด ๋ˆ„๋ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œํ•˜๋ ค๊ณ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŽธ์ง‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

AndroidManifest.xml์— ์ถ”๊ฐ€ ํ•  ์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

0.39.2 : ๊ฐ™์€ ๋ฌธ์ œ. NetInfo fetch ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ false ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ฑ์ด ์‹œ์ž‘๋œ ํ›„ ์—ฐ๊ฒฐ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

0.42.0 : ๊ฐ™์€ ๋ฌธ์ œ. ๋‚˜๋Š” ๋˜ํ•œ ์—ฌ๊ธฐ์— ๋‚ด ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ–ˆ๋‹ค : https://stackoverflow.com/questions/42642034/check-for-internet-connection-returns-wrong-results
iOS ๋ฐ macOS Sierra์—์„œ ํ…Œ์ŠคํŠธ ์ค‘์ž…๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ : ๋‚ด ๋ฌธ์ œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํ…Œ์ŠคํŠธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ์žฅ์น˜์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋งํฌ์—์„œ ๋‹ต๋ณ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :(

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

์•ฑ์ด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•Œ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ : http://stackoverflow.com/a/34732015/552669

๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ RCTNetInfo ๋Š” RCTEventEmitter ์˜ ํ•˜์œ„ ํด๋ž˜์Šค์ด๋ฏ€๋กœ startObserving ๋ฉ”์„œ๋“œ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋ฉด ๊ด€์ฐฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์•ฑ ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค์—์„œ NetInfo์— ์ž„์˜์˜ ๊ด€์ฐฐ์ž๋ฅผ ์ถ”๊ฐ€ ํ•œ ๋‹ค์Œ fetch ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (NetInfo.isConnected๋Š” ์‹ค์ œ๋กœ fetch ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค).

@ 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 ์˜ ์†”๋ฃจ์…˜์€ ์ฒ˜์Œ์—๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ–ˆ์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ ๋ชจ๋‹ฌ์˜ ๋„ค๋น„๊ฒŒ์ดํ„ฐ ๋‘ ๋ฒˆ์งธ ๋ ˆ์ด์–ด ๋‚ด๋ถ€์—์„œ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ๋ชจ๋‹ฌ์„ ๋‹ซ์€ ํ›„์—๋„ ํ•จ์ˆ˜๊ฐ€ ์ž‘๋™์„ ๋ฉˆ ์ถฅ๋‹ˆ ๋‹ค (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

https://github.com/facebook/react-native/issues/8615#issuecomment -287977178์—์„œ @ Knight704 ์˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์‚ฌ์šฉํ•  ๋•Œ @SteffeyDev ์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ ํ‘ธ์‹œ ๋˜๋Š” ํŒ ๋ชจ๋‹ฌ change ์ด๋ฒคํŠธ๊ฐ€ ์ด๋ฏธ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์กฐ๊ฑด์—์„œ ๊ทธ ๋ˆˆ์น˜ NetInfo.fetch() ๋ฐ˜ํ™˜ unknown ์ƒํƒœ๋ฅผ (์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค false ์—์„œ NetInfo.isConnected.fetch() ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค ๋•Œ๋ฌธ์— ์›๋ž˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

unknown ์กฐ๊ฑด์€ Android๊ฐ€ UNKNOWN ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ iOS์—์„œ๋งŒ ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ NetInfo.isConnected.fetch ์˜ ๊ธฐ์กด ๋™์ž‘์„ ์–ด๋Š ์ •๋„ ์œ ์ง€ํ•ด์•ผํ•˜๋ฏ€๋กœ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— ์†Œ๋ฌธ์ž๋ฅผ ์ค„์—ฌ์•ผํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค.

0.44์—์„œ ๋™์ผ

์ฒ˜์Œ์—๋Š” NetInfo๊ฐ€ ํ•œ์ฃผ๊ธฐ (on-> off) ํ›„์— ๋งŒ โ€‹โ€‹๋„คํŠธ์›Œํฌ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ๋งŒ ๊ทธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์žฅ์น˜์—์„œ๋Š” ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ / ์—ฐ๊ฒฐ ํ•ด์ œ์ฃผ๊ธฐ์—๋„ ์ฝœ๋ฐฑ์„ ์ œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ ์ฝ”๋“œ

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

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

์ด ๋ฌธ์ œ๋Š” ํ•œ๋™์•ˆ ๋‚˜๋ฅผ ๊ดด๋กญ ํ˜”๊ณ  ๊ฐ„์ ‘์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ React ํŒจํ„ด๊ณผ redux์™€์˜ ๋ฉ‹์ง„ ํ†ตํ•ฉ์„ ํฌํ•จํ•˜๋Š” RN ์˜คํ”„๋ผ์ธ / ์˜จ๋ผ์ธ ๊ฐ์ง€์— ์ดˆ์ ์„ ๋งž์ถ˜ ์ž‘์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๊ธฐ๊ธฐ, 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 ๋ฆฌ์Šค๋„ˆ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋‘ ํ”Œ๋žซํผ ๋ชจ๋‘์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
"๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ": "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, Android 7.0์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๊ถŒ์žฅ ํ•œ ๋ชจ๋“ˆ https://github.com/rauliyohmc/react-native-offline ์€ ๊ณ„์†ํ•ด์„œ https://google.com ํ•‘ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€๋งŒ์ด ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Android ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์žˆ๋Š” ๋™์•ˆ ์ผ์‹œ ์ค‘์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ์•ฑ์ด ์ผ์‹œ ์ค‘์ง€ ๋œ ๋™์•ˆ์—๋„ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” ์•ฑ์— onResume ํ•ธ๋“ค๋Ÿฌ ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์˜คํ”„๋ผ์ธ ์ƒํƒœ๋ฅผ ์ฟผ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ„๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@ alsh76 ์€ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์žˆ์„ ๋•Œ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น ๋ฉ”๋‰ด์—์„œ ์•ฑ์ด ์ข…๋ฃŒ๋˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ™ˆ ํ™”๋ฉด์ด ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
if(Platform.OS === 'android'){ NetInfo.isConnected.fetch().then(isConnected => { if(!isConnected) return; //Do something }); }

Android ๊ฐ€์ƒ ์žฅ์น˜์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋ฉฐ์น  ์ „๋งŒํ•ด๋„ ๊ดœ์ฐฎ ์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ iOS ๊ธฐ๊ธฐ์™€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์–ป๋Š” ์•ˆ์ •์ ์ด๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

iOS์—์„œ ๋‚˜๋ฅผ ์œ„ํ•ด ํŠธ๋ฆญ์„ ํ•ด์ค€ @ sumesh1993 ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!
@igorarkhipenko ๊ทธ์˜ ์ œ์•ˆ์„ ์‹œ๋„ ํ–ˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, Android์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ ํ–ˆ์Šต๋‹ˆ๊นŒ?
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

NetInfo.fetch ๋กœ @ Knight704 ๋ฐ @Ignigena ์˜ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ž‘์€ ์—…๋ฐ์ดํŠธ๋Š” ์ด์ œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ํŠธ๋ฆญ์„ํ–ˆ์Šต๋‹ˆ๋‹ค.
```
const isNetworkConnected = () => {
return NetInfo.getConnectionInfo (). then (reachability => {
if (reachability.type === 'unknown') {
return new Promise (resolve => {
const handleFirstConnectivityChangeIOS = isConnected => {
NetInfo.isConnected.removeEventListener ( 'connectionChange', handleFirstConnectivityChangeIOS);
ํ•ด๊ฒฐ (isConnected);
};
NetInfo.isConnected.addEventListener ( 'connectionChange', handleFirstConnectivityChangeIOS);
});
}
return (reachability.type! == 'none'&& reachability.type! == 'unknown')
});
}

Imho NetInfo.isConnected.fetch() ๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ˆ˜์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

@javache @sahrens @davidaurelio @janicduplessis @hramos @shergin @rigdern ์ด๊ฒƒ์— ๋Œ€ํ•œ ํƒ€์ž„ ๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ณ ๋งˆ์›Œ!

@pensierinmusica ์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์ค‘์‹ฌ์˜ ํ”„๋กœ์ ํŠธ์ด๋ฏ€๋กœ ์ข‹์€ PR์„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@shergin ์ €๋Š” React Native๊ฐ€ Facebook์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ BSD 3 ์ ˆ ๋ผ์ด์„ ์Šค๋กœ ์ถœ์‹œ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” Facebook ์ง์›์ด ๋ฒ„๊ทธ, ํŠนํžˆ ์ค‘์š”ํ•œ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์น  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  PR์€ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

cc @rigdern

RN ํ•ต์‹ฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋งŽ์€ ๋‚ด์šฉ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ž‘์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Facebook์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜๊ณ  ์ž‘์„ฑ์ž๊ฐ€ ๋ฒ„๊ทธ / ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ํ™•์ธํ•  ์ˆ˜์žˆ๋Š” ์ปค๋ฎค๋‹ˆํ‹ฐ PR์„ ์„ ํ˜ธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ios์™€ 0.47.0 ๋ฐ˜์‘์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@pensierinmusica ์ด ๋ฌธ์ œ๋Š” ๊ฐ€์žฅ ํ™•์‹คํ•˜๊ฒŒ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. .isConnected ()์—์„œ ๋ถ€์šธ ๋ฆฌํ„ด์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ๋  ๊ฒƒ์œผ๋กœ ์•Œ๊ณ ์žˆ๋Š” ์‚ฌ์ดํŠธ์— http ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ƒ์ž์—์„œ ์ž‘๋™ํ•ด์•ผํ•˜๋Š” ์ €์žฅ์†Œ๋ฅผ ์ดˆ๊ธฐํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/JamesDorrian/NetInfoCheckConnection/tree/master

์ฐธ๊ณ  : httpAddress ๋ณ€์ˆ˜๋ฅผ https://www.galwaydaily.com ์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์•„๋งˆ๋„ google.com ์ผ ์ˆ˜๋„ ์žˆ์Œ). ์ด๊ฒƒ์ด ํ•ญ์ƒ ๋ผ์ด๋ธŒ๋ผ๋Š” ๊ฒƒ์„ ๋ณด์žฅ ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด NetInfo์— ์˜ํ•ด ์ขŒ์ ˆ ๋œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

@JamesDorrian ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ "google.com"์„ ํ•‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์Šค ๋‹ˆํŽซ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// /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 ํ”„๋กœ์ ํŠธ์— Reachability Library๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

@fuatsengul ๋‚ด Xcode ํ”„๋กœ์ ํŠธ์—์„œ Reachability ํ”„๋กœ์ ํŠธ๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋‹ค๋ฅธ ์ž‘์—…์„ ๊ฐ„๋žตํžˆ

๋ฌธ์ œ๋Š” fetch api์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€๋Š” iOS . ๊ทธ๋Ÿฌ๋‚˜ addEventListener๋Š” Android์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ fetch 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 ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๋“ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฐฉ๋ฅ™ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ทธ ๊ณผ์ •์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

pull request๊ฐ€ ๋ณ‘ํ•ฉ๋˜๋ฉด Facebook์€ ๋จผ์ €์ด๋ฅผ ๋‚ด๋ถ€ React Native repo์— ํ†ตํ•ฉํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค ์ค‘์—์„œ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด GitHub ์ €์žฅ์†Œ๋กœ ๋‹ค์‹œ ๋‚ด๋ณด๋‚ด์ง‘๋‹ˆ๋‹ค.

ํ’€ ์š”์ฒญ์˜ ํ™œ๋™์„ ์‚ดํŽด๋ณด๋ฉด ์ปค๋ฐ‹์ด ์ด์ œ GitHub์— ๋ณ‘ํ•ฉ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜

image

๋น„๊ต๋ฅผ ์œ„ํ•ด ์ด์ „ ์ปค๋ฐ‹ ์„ ๋ณด๋ฉด ์—ฌ๋Ÿฌ ๋ถ„๊ธฐ์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

๋งค์›” ์ดˆ์— "๋งˆ์Šคํ„ฐ"๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ ๋ฆด๋ฆฌ์Šค ํ›„๋ณด ๋ถ„๊ธฐ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ 3 ์›” ์ดˆ์— ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค ํ›„๋ณด์— ํฌํ•จ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ React Native์˜ ์ถœ์‹œ ์ผ์ •

์•„๋‹ด ์ฝ” ๋ฉœ๋ผ
Microsoft Corp.

๋ˆ„๊ตฌ๋“ ์ง€ ์ตœ์‹  RN 54๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ™•์ธ ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋‚˜์—๊ฒŒ๋Š” ํ•ญ์ƒ iOS์™€ Android์—์„œ '์ง„์‹ค'์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณธ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

0.53 ํ•ญ์ƒ ๊ฑฐ์ง“ .. @deepaksasken .. ์•ˆ๋“œ๋กœ์ด๋“œ ์ „์šฉ ์ฝ”๋“œ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. .. ๋งŽ์€ ๋ฒ„๊ทธ์— 0.54๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@ alien3d iOS์—์„œ๋Š” ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  Android์—์„œ๋งŒ ์œ ์ง€ํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๊นŒ? Android์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@afilp ๋‚˜๋Š” ์œ„์˜ ios ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

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

์•ˆ์ •์ ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ์ „์— ์—ฌ์ „ํžˆ ๋งŽ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์‹œ 0.530 ์‚ฌ์šฉ

@ assafb81 ๋น„ํ–‰๊ธฐ ๋ชจ๋“œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„

@aflip ๋ฐ์ดํ„ฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์ง€๋งŒ ํŒจํ‚ค์ง€๊ฐ€ ์•„์ง์—†๋Š” ๊ฒฝ์šฐ isConnected true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๊นŒ?

removeEventListener๊ฐ€์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์•ฑ์ด ํ•ญ์ƒ ๋„คํŠธ์›Œํฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜์‹ ํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€?

๋˜ํ•œ ์œ„์˜ ์‚ฌ์šฉ์ž์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. NetInfo ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ๋งค์šฐ ์‹ ๋ขฐํ•  ์ˆ˜์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ๊ฒฐ๊ณผ์—†์ด ์œ„์˜ ๋งŽ์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด https://google.com ๋˜๋Š” ๋‚ด ์„œ๋ฒ„์—์„œ ๊ฑด๊ฐ• ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ๊ฐ€์ ธ ์˜ค๋Š” ๋ฐ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

@MichaelPintos ๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

RN 0.54.2
์šด์˜์ฒด์ œ : 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 ์‹ ๋ขฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ 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๋Š” def๊ฐ€ ๊ณ ์ •๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. haha!

@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 ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ–ˆ์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ ์ „์— ์ž‘์€ ์‹œ๊ฐ„ ์ œํ•œ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž ๊ธˆ ํ•ด์ œ ์งํ›„ ๋‘ ๋ฒˆ์งธ ๋ถ„ํ• ์„ ์œ„ํ•ด ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋Š” ๊นœ๋ฐ•์ž„์— ๋„์›€์ด๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : 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' ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ ์–‘์„ ์ค„์ด์‹ญ์‹œ์˜ค.

๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ iPhone 8 (React Native 0.55.3, iOS 11.3.1)์—์„œ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋กœ ์•ฑ์„ ์‹คํ–‰ํ•  ๋•Œ ์œ„์˜ ์†”๋ฃจ์…˜ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•ฑ์„ ๋‹ซ๊ณ  ๋ชจ๋ฐ”์ผ ๋ฐ์ดํ„ฐ์™€ Wi-Fi๋ฅผ ๋ˆ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ›„์† ์ด๋ฒคํŠธ๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์œผ๋กœ ์†์‹ค๋ฉ๋‹ˆ๋‹ค ( @SudoPlz ์˜ ๋‹ต๋ณ€ ์ œ์™ธ). ์žฅ์น˜์˜ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ ๋˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋ฉด NetInfo ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@nlindroos ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜๋Š” ์žฅ์น˜์—์„œ NetInfo ์ด (๊ฐ€) ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๊นŒ?

์‹ค์ œ iOS ๊ธฐ๊ธฐ์—์„œ ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ _starting_ํ•˜๋Š” ํŠน์ • ์‚ฌ๋ก€์—์„œ ๋ฆด๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด NetInfo ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  NetInfo ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์œผ๋กœ์ด๋ฅผ ๋ณด์ฆ ํ• ๋งŒํผ ๋ชจ๋“  ๊ด€๋ จ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@woodpav ์™€ @AbdallaMohamed ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ์†”๋ฃจ์…˜์˜ ์กฐํ•ฉ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
RN ๋ฒ„์ „ 0.55.4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ํ™•์ธํ•˜๋ ค๋ฉด Google ์„œ๋ฒ„์— ์ž์ฃผ ping์„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜•

iPhone 8-11.3 ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋ฐ RN ๋ฒ„์ „ 0.55.4 NetInfo.isConnected.fetch (). then (isConnected => console.log ( 'isConnected', isConnected))๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ „ํ™” ์ƒ์‚ฐ์—์„œ๋„ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ๋ฐ์ดํ„ฐ์™€ Wi-Fi์˜ ๋ณ€ํ˜•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

RN ๋ฒ„์ „ 0.55.3์œผ๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜๋ฉด ๋‹ค์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@octopitus , @martinentelect
์ด๊ฒƒ์€ ๋‚ด ์ฝ”๋“œ์ด๋ฉฐ, ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฒ„์ „ 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 ,
์—๋ฎฌ๋ ˆ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์•ˆ๋“œ๋กœ์ด๋“œ ์žฅ์น˜์—์„œ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

0.55.4 ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฒ„๊ทธ์ด๊ณ , ๋ฐฉ๊ธˆ ํ”„๋กœ๋•์…˜์—์„œ ํžˆํŠธ๋ฅผ ์ณค์Šต๋‹ˆ๋‹ค ๐Ÿ˜ข

์—ฌ์ „ํžˆ 0.56์—์„œ ๊ณ ์ •๋˜์ง€ ์•Š์Œ

@SudoPlz 0.57 ํ† ๋ก  ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์œผ๋กœ ์ˆจ๊ฒผ์Šต๋‹ˆ๋‹ค. ์•„์‹œ๋‹ค์‹œํ”ผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋Š” 0.57 ๋ฆด๋ฆฌ์Šค๋ฅผ ์–ป๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

ํ์‡„ ๋œ์ด ์Šค๋ ˆ๋“œ๋Š” ๋ฉ”์ธํ…Œ์ด๋„ˆ์—๊ฒŒ ๊ฑฐ์˜ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž ์žฌ์  ์ธ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋‚˜์˜จ ์ง€ 6 ๊ฐœ์›”์ด ์ง€๋‚œ ํ›„ ์•„๋ฌด๋„ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์—ด์ง€ ์•Š์€ ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋งˆ์Šคํ„ฐ์—์„œ ์ˆ˜์ • ๋˜์—ˆ์œผ๋ฉดํ•˜๋Š” ๊ฒƒ์ด๋ฉด ์„ธ๋ถ€ ์‚ฌํ•ญ์ด์žˆ๋Š” ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์ด์ƒ์ ์œผ๋กœ๋Š” PR์„ ๋ณด๋‚ด์‹ญ์‹œ์˜ค.

๋‹ค์Œ์€ ์ตœ์†Œํ•œ์˜ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ (iOS ์žฅ์น˜์—์„œ ํ…Œ์ŠคํŠธ ๋จ)์ด๋ฉฐ, ์œ„์—์„œ ๊ณต์œ  ๋œ @woodpav์˜ ์ผ๋ถ€ ์ฝ”๋“œ๊ฐ€ ์ƒ๋‹จ์— ์ฃผ์„ ์ฒ˜๋ฆฌ ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค : https://snack.expo.io/@notbrent/netinfo -repro.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰