菜鸟教程小白 发表于 2022-12-13 04:09:10

ios - React-Native NetInfo 总是返回 No Internet connection


                                            <p><p>我目前正在尝试在我的一个 react-native 应用程序中实现 Web 服务调用,并使用 <a href="https://www.npmjs.com/package/react-native-web-service-handler" rel="noreferrer noopener nofollow">react-native-web-service-handler</a>调用 <code>Get</code> 和 <code>Post</code> Web API。</p>

<p>请看下面我的函数。</p>

<pre><code>getRandomUserList() {   
WebServiceHandler.get(APIConstants.baseURL, null, null)
      .then((val)=&gt;{
          console.log(&#39;callapi: &#39; + JSON.stringify(val))
          this.setState({data:val})
      })
      .catch((error) =&gt; console.log(&#39;callapi:&#39;+ JSON.stringify(error)));
}
</code></pre>

<p><code>APIConstants</code> 如下,</p>

<pre><code>const APIConstants = {
    baseURL:&#34;https://randomuser.me/api/?results=50&#34;
}
</code></pre>

<p>我是这样调用这个函数的,</p>

<pre><code>componentDidMount() {
this.getRandomUserList();
}
</code></pre>

<p>请找到<code>WebServiceHandler.get</code>函数如下,</p>

<pre><code>static get(url: String, headerParam: Object, parameter: Object){
console.log(&#39;WebServiceHandler:Initiating GET request&#39;);

return new Promise(function(success, failed){
    NetInfo.isConnected.fetch().done((isConnected) =&gt; {
          console.log(&#39;WebServiceHandler: Network Connectivity status: &#39; + isConnected);
          if (!isConnected) {
            failed({name:&#39;503&#39;,message:&#34;No Internet connection&#34;});
          }else {
            let URL = url + WebServiceHandler.parameter(parameter);
            console.log(&#39;URL:-&#39; + URL);
            fetch(URL,{
            method: &#39;get&#39;,
            &#39;headers&#39;: WebServiceHandler.header(headerParam)
            })
            .then(function(response) {
            console.log(response.status);
                if (!response.ok) {
                  throw {name:response.status,message:&#34;http request failed&#34;, value:response.json()};
                }
                return response.json();

            })
            .then(function(jsonResponse) {
            console.log(&#39;************************ HTTP GET Succes ************************ &#39;);
            success(jsonResponse);
            })
            .catch(function(err) {
                console.log(&#39;************************ HTTP GET Failed **************************&#39;);
                  failed(err)
            });
          }
      });
});
}
</code></pre>

<p>它总是返回以下输出,</p>

<pre><code>WebServiceHandler: Network Connectivity status: false
App.js:50 callapi:{&#34;name&#34;:&#34;503&#34;,&#34;message&#34;:&#34;No Internet connection&#34;}
</code></pre>

<p>我在 Wi-Fi 和宽带连接上尝试了很多,但没有成功。</p>

<p>经过一番研究,我发现<a href="https://github.com/facebook/react-native/issues/8615" rel="noreferrer noopener nofollow">this article on Github</a>并实现了这个功能。</p>

<pre><code>static isNetworkConnected() {
if (Platform.OS === &#39;ios&#39;) {
    return new Promise(resolve =&gt; {
      const handleFirstConnectivityChangeIOS = isConnected =&gt; {
      NetInfo.isConnected.removeEventListener(&#39;connectionChange&#39;, handleFirstConnectivityChangeIOS);
      resolve(isConnected);
      };
      NetInfo.isConnected.addEventListener(&#39;connectionChange&#39;, handleFirstConnectivityChangeIOS);
    });
}
return NetInfo.isConnected.getConnectionInfo();
}
</code></pre>

<p>但它仍然给我同样的错误信息。谁能帮我解决这个问题?</p>

<p>仅供引用。您可以找到相同的 <a href="https://stackoverflow.com/questions/38730904/react-native-netinfo-always-returns-offline" rel="noreferrer noopener nofollow">question</a>在这里没有答案。</p>

<p>谢谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>终于得到答案了,变通办法是这样的,</p>

<pre><code>static isNetworkConnected() {
      return NetInfo.getConnectionInfo().then(reachability =&gt; {
      if (reachability === &#39;unknown&#39;) {
          return new Promise(resolve =&gt; {
            const handleFirstConnectivityChangeIOS = isConnected =&gt; {
            NetInfo.isConnected.removeEventListener(&#39;connectionChange&#39;, handleFirstConnectivityChangeIOS);
            resolve(isConnected);
            };
            NetInfo.isConnected.addEventListener(&#39;connectionChange&#39;, handleFirstConnectivityChangeIOS);
          });
      }
      reachability = reachability.toLowerCase();
      return (reachability !== &#39;none&#39; &amp;&amp; reachability !== &#39;unknown&#39;);
      });
}
</code></pre>

<p>我们应该实现 <code>getConnectionInfo()</code> 因为 <code>fetch()</code> 是不推荐使用的方法。</p>

<p>或者</p>

<p>用 <code>NetInfo.getConnectionInfo()</code> 更新 <code>NetInfo.isConnected.fetch()</code>。这也可以。</p>

<p>谢谢。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - React-Native NetInfo 总是返回 No Internet connection,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/49572815/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/49572815/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - React-Native NetInfo 总是返回 No Internet connection