React-native: iOS: إرجاع NetInfo.isConnected خاطئ دائمًا

تم إنشاؤها على ٦ يوليو ٢٠١٦  ·  139تعليقات  ·  مصدر: facebook/react-native

أقوم حاليًا بتشغيل RN 0.28.0 ...

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

سأقوم بعمل علاقات عامة ولكن لا يمكنني كتابة التعليمات البرمجية لنظام 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-bug

أواجه هذه المشكلة في 0.31 ، فهل سيتم إصلاح ذلك؟

نفس الشيء ل 0.32

knowbody كيف 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

أواجه هذه المشكلة في الإصدار 0.34.1

تحرير: تم التحديث إلى الإصدار 0.35.0 ونفس المشكلة.

نفسه على v0.35.0

أواجه نفس المشكلة في الإصدار 0.36.0

يعمل مقتطف knowbody معي في 0.36

Dnld : Ehesp يقول إنه يعمل على v.036 ، أنت و 5 آخرين لا؟ هل هذا لم يحل في نهاية المطاف؟ اعتدت أن أواجه مشكلات مع 0.33 أيضًا ، وأود الترقية. شكر.

لم يتغير الكود الأساسي فعليًا لذا سأفاجأ إذا تم "إصلاحه".

أضع إصلاحًا بين علامات الاقتباس لأنه يبدو أن الدافع وراء هذا التغيير هو فقط إعداد الآلات الأصلية التي تراقب حالة الشبكة إذا كان كود التطبيق مهتمًا بمراقبتها.

تسجل التطبيقات الاهتمام عن طريق إضافة مستمع الحدث الذي يبدأ بعد ذلك في

في هذه المرحلة ، يبدو أن هذا هو السلوك المطلوب ، لذا ربما يلزم تغيير الوثائق. يُرجع NetInfo.isConnected قيمة منطقية لذلك لا تعبر عن أن الحالة غير معروفة وأن ذلك لن يتغير حتى تقوم بإضافة مستمع الحدث. بدلاً من ذلك ، يمكن تغيير الوظيفة لإرجاع null أو قيمة منطقية.

تطبيقاتي لها رمز مشابه جدًا لما نشره knowbody . ومع ذلك ، لا أتصل بـ NetInfo.isConnected.fetch() على الإطلاق ، لأنه عديم الفائدة عند بدء التشغيل.

أفترض أن هناك اتصالاً ، أضف المستمع ، وبعد ذلك سيتم تحديث الحالة عندما تكون حالة الاتصال غير معروفة.

0.34.1 لا يزال لا يعمل

نفس المشكلة مع RN 0.37.0

@ xing-zheng لسبب ما ، لا يقوم الحل الخاص بك إلا بإرجاع "MOBILE" ، حتى عند إيقاف تشغيل wifi على جهاز الكمبيوتر الخاص بي ، والذي يجب أن ينعكس في المحاكي الخاص بي. اي فكرة لماذا؟

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) {
إذا (! sConnected) {
// قم بعمل
}
NetInfo.isConnected.removeEventListener ("تغيير" ، handleFirstConnectivityChange) ؛
}

إذا (Platform.OS === 'ios') {
NetInfo.isConnected.addEventListener ("تغيير" ، handleFirstConnectivityChange) ؛
} آخر {
NetInfo.isConnected.fetch (). ثم (isConnected => {
إذا (! sConnected) {
// قم بعمل
}
}

هل يمكنكم مساعدتي؟

imbudhiraja هل يعمل على أي من المنصات؟

لا ، لم يكن يعمل على أي منصة

شكر
مانيش بوذراجا

في 3 كانون الثاني (يناير) 2017 الساعة 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 الذي وصفه Aristekrat . هذا أكثر إثارة للقلق - هل يمكن لشخص ما المساعدة في توفير طريقة مفصلة لإعادة إنتاج هذه المشكلة؟ ثم سأكون قادرًا على المساعدة في إصلاحها.

RN 0.38.1 والإصدارات الأقدم ، 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);

};

يسترد 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 الخاص بك. هذا واحد أوقفني.

نفس المشكلة مع 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 وظيفة الجلب بالفعل)

وفقًا لاقتراحات @ 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

وجود هذه المشكلة أيضًا. كان قادرًا على أن يعمل بشكل عشوائي ثم توقف عن العمل.

نجح حل

ماذا ينقصني؟

    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 في https://github.com/facebook/react-native/issues/8615#issuecomment -287977178 في معظم الحالات ، يعمل هذا بشكل جيد ، ولكن عندما يكون لدي الوسائط المدفوعة أو المنبثقة لن يتم حل الكود نفسه أبدًا لأنني أفترض أن الحدث 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 فقط على نظام iOS لأن Android يُرجع UNKNOWN . هذا أيضًا هو سبب تقليل الأحرف قبل إرجاع الحالة لأن هذا يجب أن يحتفظ بشكل أو بآخر بالسلوك الحالي من NetInfo.isConnected.fetch .

نفسه في 0.44

لاحظت في البداية أن NetInfo يريد فقط إعادة تغيير حالة الشبكة بعد دورة واحدة (تشغيل -> إيقاف). اتضح أن لديها هذه المشكلة فقط في جهاز المحاكاة. على جهاز حقيقي ، يقوم بتشغيل رد الاتصال بشكل صحيح حتى لدورات توصيل / فصل متعددة.

عينة من الرموز

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

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

أزعجتني هذه المشكلة لفترة من الوقت وانتهى بي الأمر بشكل غير مباشر بإنشاء مكتبة أدوات مساعدة صغيرة تركز على اكتشاف RN دون اتصال / عبر الإنترنت ، بما في ذلك أنماط React النموذجية والتكامل الجيد مع الإعادة.

إنه يعمل بشكل صحيح على أجهزة حقيقية ، كل من Android و iOS. ومع ذلك ، يمكنني أيضًا أن أؤكد أنه في بعض الأحيان لا يتم تشغيل المستمع في محاكي iOS وتصبح حالة الاتصال غير متسقة. لم أجرب بعد الحلول التي اقترحها @ knight704 و Ignigena ( هنا وهنا على التوالي) ولكن من المحتمل أن أختبرها قريبًا عندما أحصل على بعض الوقت.

العلاقات العامة هي أيضًا موضع ترحيب كبير في حالة وجود المزيد من الأشخاص الذين يؤكدون أن هذه الحلول تعمل مثل السحر!

ارجو الاصلاح.

إذا كان من غير المحتمل أن يتم إصلاح هذا قريبًا ، فهل يمكننا على الأقل تحديث المستندات للإشارة إلى أن هذا لا يعمل في iOS؟

@ jpb12 ربما يستحق الأمر إنشاء العلاقات العامة ومعرفة ما إذا كانوا

أواجه هذه المشكلة في إصدار Android. يبدو أنه مرتبط بالذهاب إلى الخلفية والعودة إلى المقدمة. لسوء الحظ ، لا يمكنني إعادة إنتاج هذه المشكلة بشكل موثوق ، لكنها تحدث بالتأكيد بعد عدة انتقالات في الخلفية / المقدمة. خاصة إذا تم تغيير حالة الاتصال في ذلك الوقت

عندما يحدث
يُرجع NetInfo.isConnected.fetch().then(isConnected => {...}) دائمًا false
يُرجع NetInfo.fetch().then((reach) => {...}) دائمًا NONE
إضافة / إزالة المستمعين لا يساعد

سأكون ممتنًا جدًا لأي طريقة موثوقة لاكتشاف حالة الاتصال الحقيقية

أواجه سلوكًا غريبًا لأن الاتصال يعود صحيحًا عند الاتصال بشبكة wifi (حتى الآن لا بأس به) ولكن إذا لم يصل المودم إلى الإنترنت ، فسيظل isConnected صحيحًا. لست متأكدًا حقًا من كيفية التحقق من اتصال الإنترنت بشكل فعال ، وليس فقط اتصال الشبكة. أيه أفكار؟ شكر

kodatech يجب أن تساعدك هذه الوحدة في حل هذه المشكلة. لقد استخدمته مؤخرًا في مشروع وأوصي به بشدة https://github.com/rauliyohmc/react-native-offline

جزيل الشكر

@ Knight704 بفضل إخوانه.

craigcoles هل لديك أي رمز عمل يمكنني اتباعه؟

nmfzone ليس لدي أي شيء يمكنني عرضه لك ، ولكن هناك الكثير من أمثلة التعليمات البرمجية في الملف التمهيدي 😃

أنا أستخدم أحداث مستمع 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 التي تمت التوصية بها أعلاه فقط بشكل مستمر ping https://google.com . إنه يعمل ولكني أفضل إصلاح هذا الخطأ

هذا منطقي لأن تطبيقات Android معلقة أثناء وجودها في الخلفية. لتلقي الأحداث ، ستحتاج إلى إنشاء خدمة ستستمر في العمل حتى أثناء تعليق التطبيق.

بدلاً من ذلك ، يمكنك إضافة معالج onResume إلى التطبيق والاستعلام عن حالة عدم الاتصال بعد ذلك. يجب أن يكون ذلك أبسط من إنشاء وإدارة خدمة.

@ alsh76 بالنسبة لي ، إنه يعمل عندما يكون التطبيق في الخلفية ، ولا يعمل عندما يتم
لقد حللت ذلك عن طريق استدعاء الوظيفة التالية عندما يتم تشغيل شاشتي الرئيسية.
if(Platform.OS === 'android'){ NetInfo.isConnected.fetch().then(isConnected => { if(!isConnected) return; //Do something }); }

واجهت نفس المشكلة مع جهاز Android الظاهري. لكن الشيء هو أنه كان على ما يرام منذ بضعة أيام وما زال يفعل ذلك على جهاز iOS والمحاكي. هل وجد شخص ما طريقة مستقرة وصحيحة للحصول على حالة اتصال الشبكة؟

شكرًا @ sumesh1993 الذي فعل الحيلة بالنسبة لي في iOS!
igorarkhipenko هل جربت اقتراحه؟

مرحبًا ، هل أضفت إذنًا على سبيل المثال ، يجب إضافة android
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

مجرد تحديث صغير للحلول بواسطة @ Knight704 و Ignigena حيث تم إهمال NetInfo.fetch الآن. هذا فعل الخدعة لي:
""
const isNetworkConnected = () => {
إرجاع NetInfo.getConnectionInfo (). ثم (قابلية الوصول => {
إذا (reachability.type === 'غير معروف') {
إرجاع الوعد الجديد (حل => {
const handleFirstConnectivityChangeIOS = isConnected => {
NetInfo.isConnected.removeEventListener ('connectChange' ، handleFirstConnectivityChangeIOS) ؛
حل (غير متصل) ؛
} ؛
NetInfo.isConnected.addEventListener ('connectChange' ، handleFirstConnectivityChangeIOS) ؛
}) ؛
}
العودة (reachability.type! == 'none' && reachability.type! == 'غير معروف')
}) ؛
}

Imho NetInfo.isConnected.fetch() ميزة مهمة ويجب إصلاحها في أسرع وقت ممكن!

javachesahrensdavidaureliojanicduplessishramossherginrigdern هناك أي جدول زمني لذلك؟

شكرا!

pensierinmusica هذا مشروع مدفوع من قبل المجتمع ، لذلك أود الحصول على علاقات عامة جيدة.

shergin اعتقدت أن

ccrigdern

يتم كتابة الكثير من التعليمات البرمجية الأساسية لـ RN وصيانتها من قبل المجتمع.

وهناك العديد من الميزات والوظائف التي لا يستخدمها Facebook ، لذلك يصعب علينا تحديد أولوياتها وتفضيل العلاقات العامة المجتمعية حيث يمكن للمؤلف التحقق من إصلاح الخطأ / حالة الاستخدام.

لدي أيضًا مشكلة في الرد 0.47.0 مع نظام التشغيل iOS.

pensierinmusica هذه المسألة بالتأكيد يجب أن تكون لها الأولوية. ما مدى صعوبة الحصول على عائد منطقي من .isConnected ()؟

حسنًا ، إليك حل بديل يجب أن يؤدي الغرض (حسنًا بالنسبة لي). أرسل طلب http إلى موقع أعرف أنه سيكون نشطًا وأقوم بتقييم الاستجابة.

لقد قمت بتهيئة الريبو الذي يجب أن يعمل خارج الصندوق. https://github.com/JamesDorrian/NetInfoCheckConnection/tree/master

ملاحظة: تأكد من تغيير متغير httpAddress من https://www.galwaydaily.com إلى شيء آخر (ربما google.com) لأنني لا أستطيع أن أضمن أنه سيكون متاحًا دائمًا. آمل أن يساعد هذا أي شخص يشعر بالإحباط بسبب NetInfo!

تضمين التغريدة

JamesDorrian شكرًا ، انتهى بي الأمر بفعل شيء مشابه ، pinging "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 على هذه المسألة من فضلك ، هذا ما تُستخدم فيه ردود الفعل.

دائرة الرقابة الداخلية:
أول طلب. إذا تعطل الخادم ، فإن الهاتف يحتوي على wifi.
NetInfo.isConnected.fetch (). ثم ((isConnected) => {alway false}
0.49.3.

kddc يبدو أن الحل الخاص بك يعمل بشكل جيد في التطوير 👍

فقط أضف مكتبة قابلية الوصول إلى مشروع هنا ، إنه الحل.

fuatsengul لقد أضفت مشروع قابلية الوصول كمكتبة في مشروع Xcode الخاص بي ، ولكن لا تزال المشكلة لم تحل ، هل يمكنك إعلامي ما الذي يجب فعله أيضًا لحل المشكلة؟ شكر.

يبدو أن المشكلة تتعلق فقط بواجهة برمجة تطبيقات الجلب .. ومع ذلك ، تعمل إضافة مستمع الأحداث على 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 خاطئ و reachability.type لا شيء
  3. ios -> وضع الطائرة متوقف
  4. تنفيذ الجلب -> الحصول على "خطأ في الشبكة" ، isConnected خاطئ و reachability.type لا شيء

طوال وقت تشغيل التطبيق ، في الخلفية أثناء تغيير وضع الطائرة.
إعادة تشغيل التطبيق فقط "التقاط" اتصال الشبكة الجديد.

+1

+1

شكرا على الإصلاح @ alburdette619
إذن ، هذا ثابت في هل سيتوفر في الإصدار 0.54؟

@ assafb81 لست متأكدًا ، على ما يبدو أنهم

عندما يتم دمج طلب السحب الخاص بك ، يقوم Facebook أولاً بدمجه في React Native repo الخاص به ويقوم بإجراء اختبارات إضافية عليه من بين أشياء أخرى. عندما ينجح ذلك ، يتم تصدير التغيير مرة أخرى إلى GitHub repo.

من خلال النظر في نشاط طلب السحب ، يمكنك رؤية الالتزام مدمجًا الآن على GitHub . بالنظر إلى معلومات الالتزام ، يمكنك معرفة الفروع التي تم تضمينها فيها. حاليًا ، يوجد فقط في الفرع "الرئيسي":

image

للمقارنة ، إذا نظرت إلى التزام أقدم ، يمكنك رؤيته يظهر في عدد من الفروع:

image

في بداية كل شهر ، يتم إنشاء فرع مرشح إصدار جديد على أساس "رئيسي". لذلك من المحتمل أن يكون التغيير الخاص بك في الإصدار القادم المرشح في بداية شهر مارس. يمكنك قراءة المزيد حول جدول إصدار React Native في منشور المدونة هذا .

آدم كوميلا
شركة مايكروسوفت.

هل تحقق أي شخص من هذه المشكلة باستخدام أحدث RN 54؟ بالنسبة لي ، يعود الأمر دائمًا إلى `` صحيح '' الآن على نظام التشغيل iOS و Android ، فهو يعمل بشكل جيد تمامًا. أي شخص آخر يرى هذه المسألة ؟

0.53 خطأ دائمًا ..deepaksasken .. يبدو أنني بحاجة إلى تعطيل رمز android فقط .. لا يمكن استخدام 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 هل وجدت حلاً لمشكلة وضع الطائرة؟ أنا أستخدم الحل الخاص بك في 0.53.

aflip عندما يتم تمكين البيانات ولكن لا توجد حزمة لا تزال تقوم بإرجاعها تكون متصلة صحيحة. هل حاولت حلها؟

لماذا يوجد برنامج 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 يجب أن تكون ثابتة هاها!

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

تأكد من استيراد هذا الملف وإلا فلن يتم تنفيذه.

ملاحظة: إذا كنت تستخدم fetch ، فاستخدم method: 'HEAD' لتقليل كمية البيانات المنقولة.

لم يعمل أي من الحلول المذكورة أعلاه عند تشغيل التطبيق في وضع التصحيح على iPhone 8 (React Native 0.55.3 ، iOS 11.3.1) في السيناريو التالي: أغلق التطبيق وابدأ تشغيله ببيانات الجوال وإيقاف تشغيل wifi.

يتم فقد أي أحداث لاحقة مع جميع الحلول المذكورة أعلاه (باستثناء إجابةSudoPlz ). تشغيل التطبيق فقط في وضع الإصدار على الجهاز أو في وضع التصحيح على جهاز محاكاة أدى إلى تشغيل أي أحداث NetInfo .

nlindroos ، فهل تؤكد بالفعل أن NetInfo يعمل بشكل جيد على الأجهزة التي تعمل بإصدار الإصدار؟

في الحالة المحددة لـ _starting_ ، كان التطبيق في وضع عدم الاتصال على جهاز iOS فعلي ، كان التشغيل في وضع الإصدار هو الحل الوحيد العامل للحصول على أي أحداث NetInfo ليتم تشغيلها. لم أختبر جميع السيناريوهات ذات الصلة بشكل كافٍ لتأكيد ذلك كحل عام لجميع مشاكل NetInfo .

أستطيع أن أقول إن مجموعة الحلول التي عملت معي woodpav و AbdallaMohamed
أنا أستخدم RN الإصدار 0.55.4

يجب عليّ اختبار اتصال خادم Google بشكل متكرر للتحقق من اتصال الإنترنت 😕

أنا أستخدم جهاز محاكاة iPhone 8 - 11.3 وعلى RN الإصدار 0.55.4 NetInfo.isConnected.fetch (). ثم (isConnected => console.log ('isConnected'، isConnected))
دائما ترجع خطأ. هذه مشكلة في الإنتاج على الهاتف أيضًا. جربت اختلافات في بيانات الجوال وواي فاي.

عند الرجوع إلى الإصدار 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 (على المحاكي على الأقل).
هل توجد أي حلول بديلة للمستمعين على Android أثناء استخدام NetInfo؟

    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

SudoPlz لقد قمت بإخفاء تعليقك على 0.57 موضوع المناقشة باعتباره خارج الموضوع. كما تعلم ، هناك المئات من المشكلات المفتوحة في الريبو ، لكن هذا الموضوع يركز على الحصول على إصدار 0.57.

هذا الخيط على الخيط المغلق غير مرئي إلى حد كبير للمشرفين ، وأنا مندهش من أنه بعد ستة أشهر من هبوط إصلاح محتمل ، لم يفتح أحد مشكلة جديدة. إذا كان هذا شيئًا ترغب في إصلاحه بشكل رئيسي ، فيرجى فتح مشكلة جديدة بالتفاصيل ، ومن الأفضل إرسال PR.

في ما يلي مثال بسيط قابل للتكرار (تم اختباره على جهاز iOS) ، مع بعض التعليمات البرمجية من https://snack.expo.io/@notbrent/netinfo -repro.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات