2016-08-10 12 views
4

반응하는 기본 앱 (xcode 시뮬레이터 v9.2/xcode 7.2.1에서 OS X Yosemite)을 테스트하고 있습니다. 아래 코드와 함께 Network request failed 오류가 발생합니다. 올바른 appid를 가진 실제 URL은 브라우저에서 정상적으로 작동하고 json 형식으로 올바른 정보를 제공하며 promise/api 호출이 정상적으로 처리됩니다.React-native IOS : 네트워크 요청이 실패했습니다.

나는 방화벽을 사용하고 있지 않습니다. 연결 문제를 해결하고 개발자 설정에서 Allow HTTP Services을 활성화했지만 오류가 계속 발생합니다.

어떤 문제가 있는지 알고 싶습니다. 다음과 같이 실제 오류는 다음과 같습니다

-- There has been a problem with your fetch operation: Network request failed 
-- Api call error = Network request failed 

다음은 api.js 코드입니다 :
var _ = require('lodash'); 
var rootUrl = 'http://api.openweathermap.org/data/2.5/weather?APPID=xxxxxxxxxxxxxxxxxxxxxx'; 

var kelvinToF = function(kelvin) { 
    return Math.round((kelvin - 273.15) * 1.8 + 32) + ' ˚F' 
}; 

var kelvinToC = function(kelvin) { 
    return Math.round(kelvin - 273.15) + ' ˚C' 
}; 

module.exports = function(latitude, longitude) { 
    var url = `${rootUrl}&lat=${latitude}&lon=${longitude}`; 
    console.log(url); 
    return fetch(url) 
    .then(function(response){ 
     return response.json(); 
    }) 
    .then(function(json){ 
     return { 
     city: json.name, 
     temperature1: kelvinToF(json.main.temp), 
     temperature2: kelvinToC(json.main.temp), 
     description: _.capitalize(json.weather[0].description) 
     } 
    }) 
    .catch(function(error) { 
    console.log('There has been a problem with your fetch operation: ' + error.message); 
    throw error; 
}); 
} 

가 여기에 index.ios.js 코드입니다.

/* --depreciated 

var React = require('react-native'); 

var { 
    AppRegistry, 
    MapView, 
    View, 
    Text, 
    StyleSheet 
} = React; 
*/ 


// updated 
import React from 'react'; 

// updated 
import { 
    AppRegistry, 
    MapView, 
    View, 
    Text, 
    StyleSheet, 
} from 'react-native'; 

var Api = require('./src/api'); 

var Weather = React.createClass({ 
    getInitialState: function() { 
    return { 
     pin: { 
     latitude: 0, 
     longitude: 0 
     }, 
     city: '', 
     temperature1: '', 
     temperature2: '', 
     description: '' 
    }; 
    }, 
    render: function() { 
    return <View style={styles.container}> 
     <MapView 
     annotations={[this.state.pin]} 
     onRegionChangeComplete={this.onRegionChangeComplete} 
     style={styles.map}> 
     </MapView> 
     <View style={styles.textWrapper}> 
     <Text style={styles.text}>{this.state.city}</Text> 
     <Text style={styles.text}>{this.state.temperature1}</Text> 
     <Text style={styles.text}>{this.state.temperature2}</Text> 
     <Text style={styles.text}>{this.state.description}</Text> 
     </View> 
    </View> 
    }, 
    onRegionChangeComplete: function(region) { 
    this.setState({ 
     pin: { 
     longitude: region.longitude, 
     latitude: region.latitude 
     } 
    }); 

    Api(region.latitude, region.longitude) 
     .then((data) => { 
     console.log(region.latitude); 
     console.log(region.longitude); 
     console.log('data = ' + data); 
     this.setState(data); 
     }) 
     .catch((error)=>{ 
    console.log("Api call error = ", error.message); 
    // alert(error.message);  
    }); 
    } 
}); 


var styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    alignItems: 'stretch', 
    backgroundColor: '#F5FCFF' 
    }, 
    map: { 
    flex: 2, 
    marginTop: 30 
    }, 
    textWrapper: { 
    flex: 1, 
    alignItems: 'center' 
    }, 
    text: { 
    fontSize: 30 
    } 
}); 

AppRegistry.registerComponent('weather',() => Weather); 

답변

4

info.plist에서 NSAppTransportSecurity 정책을 변경해야합니다. 기본적으로 ios 8 이상에서는 일반 텍스트 요청이 차단됩니다. Transport security has blocked a cleartext HTTP

+0

감사합니다. 그 모든 것들을 우적 우적 씹어 먹으려 고 힘들었지 만 이것은 정확한 답을 지적했습니다. –

1

내 코드가 익숙한 것처럼 보입니다. Stephen Grider가 제공하는 반응 형 기본 코스로 빌드 응용 프로그램을 배우는 것 같습니다.

심지어이 문제가있었습니다.

은 api.js 파일의 시작 부분에 delete GLOBAL.XMLHttpRequest;을 포함합니다. 이처럼

: @ while1의 대답에

delete GLOBAL.XMLHttpRequest; 
var _ = require('lodash'); 
var rootUrl = 'http://api.openweathermap.org/data/2.5/weather?APPID=xxxxxxxxxxxxxxxxxxxxxx'; 
+0

하하 네가 맞아, 맞아. 그 코스에서 온거야. GLOBAL.XMLHttpRequest 란 무엇입니까? 나는 당신이 제안한 것을 시도했다, 나는 이제'XMLHttpRequest가 정의되지 않았다. '오류를 얻고있다. 특히'가져 오기 작업에 문제가있다. : XMLHttpRequest가 정의되지 않았다.'그리고'Api call error = XMLHttpRequest가 정의되지 않았다. 'Ashok . –

1

확인 감사 위, 나는 나를 위해 일한 답을 발견했다. 위의 질문에 코드가 괜찮습니다. info.plist 파일을 변경해야했습니다. 와우, 엉덩이 사과에 어떤 고통이 있는지, 왜 그들이 매우 복잡한 일을하게 될까요?

기본적으로 info.plist 파일에 다음을 추가했습니다. 이처럼

<key>NSAllowsArbitraryLoads</key> 
<true/> 

는 :

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

위 @ while1의 대답에있는 링크에서 이에 대한 자세한 정보를 참조하십시오.

관련 문제