反应原生 - 获取在iOS模拟器上不起作用(没有检查其他)



这看起来是React上最常见的问题。我尝试了各种问题/答案中给出的所有方法。要么是过时了,要么就是坏了。

  1. 我创建了一个新的react native项目(所有内容都是最新的)。
  2. 我简单地创建了一个简单的组件,它有一个REST调用
  3. 这个REST调用永远不会完成并进入承诺的下一步。

下面是代码

const Home = () => {
useEffect(() => {
console.log('start');
fetch('https://jsonplaceholder.typicode.com/todos/1', {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json'
}
}).then((response) => response.json()).then((data) => {
console.log('result: ', data);
}).catch((err) => {
console.log('failed', err);
}).finally(() => {
console.log('Any hope?');
});
});
return (<Text>Lets log the API's for now</Text>);
};

上面的代码只记录start在cli或调试窗口中的日志,没有其他的,甚至没有写在finally中的日志。

我使用xcode 12.0 (12A7209), react 16.13.1, @babel/core 7.12.10.

这不仅仅是fetch,我已经尝试过在react native中为http使用其他库,如axios,没有什么真正的帮助。他们都倾向于做同样的事。

我已经通过在模拟器中打开一个网站来检查浏览器,它有工作网络。我尝试替换API,可以在网上免费获得。

顺便说一句,这是一个裸工程。我用expo试过类似的例子,它的行为恰好是一样的。

感谢

以防别人需要。我通过添加

解决了这个问题
<key>NSAllowsArbitraryLoads</key>
<true/>

到Info。Plist文件位于项目的ios文件夹内。

因此我改变了

<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict> 

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>

我遇到了这个问题,XMLHttpRequest从来没有像onload或onreadystatechange那样触发它的回调。这导致React-Native的Fetch实现中断(因为它实际上是XMLHttpRequest的包装器)。我从来没有解决过这个问题,但我通过使用不同的库来代替React-Native Global的Fetch原型与React-Native - Fetch -blob来解决这个问题。react-native-fetch-blob是长期运行的fetch替代品中维护得最好的版本,它使用了native模块,实现更健壮。

所以对于那些在那里搜索的人,可能会有各种各样的问题。某些版本的Android要求你声明clearText(未加密)在互联网上发送是否公平。有些iOS版本出现了SSL证书问题,即使证书是有效的。这是一个不常见的错误,但有记录的问题与RN的取回可以追溯到2015年,类似的问题在这篇文章中。同样,我的解决方案是完全替换Fetch,并用react-native-fetch-blob代替它,它具有Fetch API的本机实现。在Metro中有时也有一个问题,如果你关闭inlineRequires, fetch有时会开始工作。忘掉这一切,用fetch代替。

最新更新