将 xcode 更新到 8.3.2 后反应本机网络不工作
react native networking not working after updating xcode to 8.3.2
突然间,在我将 xcode 更新到 8.3.2 后,我所有的应用程序都收到 Newtwork 请求失败,
Network request failed
TypeError: Network request failed
我尝试更改 /ios/[projectname]/info.plist 中的值,但仍然出现相同的错误,即使我正在调用 https:// 端点。
<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>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
重现步骤:-
$ react-native init newProject && cd newProject && react-native 运行-ios
打开index.ios.js并添加测试
<Button title="fetch" onPress={async ()=>{
const r = await fetch('http://localhost/ivf/system/settings');
console.log(r);
}}/>
<Button title="fetchs" onPress={async ()=>{
const r = await fetch('https://ivf.simpleinfroamtics.com/system/settings').catch(console.log);
console.log(r);
}}/>
通过单击两个链接,它们都将失败并显示 newwok 请求失败。
我尝试使用 xhr insteed
componentDidMount(){
<Button title="console" onPress={()=>{
console.log('log');
console.debug('debug');
console.info('info');
console.warn('warn');
}}/>
<Button title="fetch" onPress={async ()=>{
const r = await fetch('http://localhost/ivf/system/settings');
console.log(r);
}}/>
<Button title="fetchs" onPress={async ()=>{
const r = await fetch('https://ivf.simpleinfroamtics.com/system/settings').catch(console.log);
console.log(r);
}}/>
}
但完全相同的错误。
我们该如何解决这个问题???我已经完成了我的整个应用程序,我正在等待修复此问题以便我可以发布:(
谢谢
您的例外仅允许与非本地主机的非安全连接 url。您需要更改它以尝试使用 http 协议(例如“http://ivf.simpleinfroamtics.com/system/settings”)。如果你想通过 https 连接,你需要找出 URL 是什么违反了 ATS 政策。可能是它不支持 TLS 1.2,或者它不支持前向保密,或者密钥不足。
要测试 URL 是否符合 ATS,请在 Mac 上使用 nscurl --ats-diagnostics <url>
命令。您可以在 post 中了解更多关于 ATS 的信息,以及如何使用/解释上面的 nscurl 命令的结果。
最后,要允许本地主机连接,您需要添加值为 true 的 NSAllowsLocalNetworking
键,以允许您的应用不安全地连接到本地网络资源,包括本地主机。
我还建议您提高 CFNETWORK_DIAGNOSTICS 级别,这样您就可以准确地看到失败的原因。您可以了解更多相关信息 here。
突然间,在我将 xcode 更新到 8.3.2 后,我所有的应用程序都收到 Newtwork 请求失败,
Network request failed
TypeError: Network request failed
我尝试更改 /ios/[projectname]/info.plist 中的值,但仍然出现相同的错误,即使我正在调用 https:// 端点。
<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>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
重现步骤:- $ react-native init newProject && cd newProject && react-native 运行-ios
打开index.ios.js并添加测试
<Button title="fetch" onPress={async ()=>{
const r = await fetch('http://localhost/ivf/system/settings');
console.log(r);
}}/>
<Button title="fetchs" onPress={async ()=>{
const r = await fetch('https://ivf.simpleinfroamtics.com/system/settings').catch(console.log);
console.log(r);
}}/>
通过单击两个链接,它们都将失败并显示 newwok 请求失败。
我尝试使用 xhr insteed
componentDidMount(){
<Button title="console" onPress={()=>{
console.log('log');
console.debug('debug');
console.info('info');
console.warn('warn');
}}/>
<Button title="fetch" onPress={async ()=>{
const r = await fetch('http://localhost/ivf/system/settings');
console.log(r);
}}/>
<Button title="fetchs" onPress={async ()=>{
const r = await fetch('https://ivf.simpleinfroamtics.com/system/settings').catch(console.log);
console.log(r);
}}/>
}
但完全相同的错误。
我们该如何解决这个问题???我已经完成了我的整个应用程序,我正在等待修复此问题以便我可以发布:(
谢谢
您的例外仅允许与非本地主机的非安全连接 url。您需要更改它以尝试使用 http 协议(例如“http://ivf.simpleinfroamtics.com/system/settings”)。如果你想通过 https 连接,你需要找出 URL 是什么违反了 ATS 政策。可能是它不支持 TLS 1.2,或者它不支持前向保密,或者密钥不足。
要测试 URL 是否符合 ATS,请在 Mac 上使用 nscurl --ats-diagnostics <url>
命令。您可以在 post 中了解更多关于 ATS 的信息,以及如何使用/解释上面的 nscurl 命令的结果。
最后,要允许本地主机连接,您需要添加值为 true 的 NSAllowsLocalNetworking
键,以允许您的应用不安全地连接到本地网络资源,包括本地主机。
我还建议您提高 CFNETWORK_DIAGNOSTICS 级别,这样您就可以准确地看到失败的原因。您可以了解更多相关信息 here。