本机iOS模拟器网络连接

时间:2016-06-22 21:04:18

标签: react-native fetch

我试图在我的本机应用程序中获取()一些数据并且它失败了。所以,我找到了NetInfo,我在应用程序启动时使用它,并在使用iOS模拟器的每个MapView onRegionChangeComplete事件中使用它(如果重要的话,iPhone5s和iPhone 6),NetInfo返回的状态为{{1} } 每次。 MapView工作正常,我可以在模拟器上使用Safari浏览网页。我发现与fetch()失败相关的最常见问题是开发人员在其网址中使用localhost。我使用http://api.openweathermap.org/data/2.5/weather了吗?作为我的网址,所以我确信这是一个模拟器问题。我没有iOS设备可以测试,而MapView还没有可用于Android,因此我无法在Android上进行测试。有人能指出我正确的方向吗?

谢谢。

PS。我登录到控制台的提取错误是 - unknown

这是我的代码:

TypeError: Network request failed

第二次更新:除了下面的更新和信息之外,我还将其缩小为iOS模拟器问题。我在Android设备上遇到同样的问题。同样 - 模拟器唯一出现问题的是使用http:url发出fetch()请求。当我使用https:url时,模拟器很高兴。我还在模拟器中找到了一些DEV设置以允许http请求。这没有给我任何改变。

更新:我已将问题缩小到网址。如果我在react-native中使用fetch,这个url http://api.openweathermap.org/data/2.5/weather?APPID=MYAPPKEY&lat=35&lon=139与MYAPPKEY等于我的密钥,则会失败。如果我在浏览器中使用相同的URL,它将返回我期待的json。

另外,如果我在react-native中使用fetch并使用此网址https://api.github.com/users/mralexgray/repos,我就不会获得module.exports = function(latitude, longitude) { var rootURL = 'http://api.openweathermap.org/data/2.5/weather?APPID=MYAPIKEY&lat=35&lon=139'; console.log(rootURL); return fetch(rootURL) // fetch is part of react or react-native, no need to import .then(function(response){ // method chaining used here // Shorthand to check for an HTTP 2xx response status. // See https://fetch.spec.whatwg.org/#dom-response-ok if (response.ok) { console.log('Response from fetch was ok, returning response to next then'); return response } else { // Raise an exception to reject the promise and trigger the outer .catch() handler. // By default, an error response status (4xx, 5xx) does NOT cause the promise to reject! console.log('Throwing error to .catch with statusText: ' + response.statusText); throw Error(response.statusText); } }) .then(function(response) { console.log('Returning JSON to next then') return response.json(); }) .then(function(json) { // chain a second function when JSON is returned console.log('Returning this json to Api call in index.os.js' + json); return { city: json.name, //temperature: kelvinToF(json.main.temp), //decription: json.weather[0].description } }) .catch(function (error) { console.log('My fetch Error: ' + error + 'Specific error: ' + error.message); }) } ,我会获得有效的json。

另一个有趣的注意事项 - 如果我在浏览器中输入openweathermap网址,地址栏会在返回json时删除http://部分。当我在浏览器中输入github地址时,地址栏会保留https://。

另一个有趣的注意事项 - 如果我使用非https网址,则会失败。

1 个答案:

答案 0 :(得分:9)

如果您使用的是react-native@0.28或更高版本,则在Plist.Info中删除了以下内容:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

这补充说:

<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSAppTransportSecurity</key>
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

这与iOS中的ATS有关,请查看以下链接以获取更多信息。 https://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ 您基本上需要将您使用的http域添加到plist.Info