如果ssl(https)证书无效,则React Native XMLHttpRequest请求将失败

当我正在做XMLHttpRequest到https服务器与无效的证书React Native抛出exception“的操作无法完成。(NSURLErrorDomain错误-1202。)”

是否有可能禁用ssl警告/检查React Native XMLHttpRequest?

免责声明:这个解决scheme应该是临时的,并且logging下来,以便它不会停留在软件的生产阶段,这只是为了开发。

对于iOS,您只需打开xcodeproject(在RN的iOS文件夹内),进入RCTNetwork.xcodeproj并在该项目中导航到RCTHTTPRequestHandler.m

在那个文件中你会看到这样的一行:

  #pragma mark - NSURLSession delegate 

在那行之后,添加这个函数

 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); } 

瞧,你现在可以在没有有效证书的情况下对你的API进行不安全的调用。

这应该够了,但如果你仍然有问题,你可能需要去你的项目的info.plist,左键单击它,并select打开为…源代码。

最后只是添加

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

所以你的文件看起来像这样

  ... <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeRight</string> </array> <key>UIViewControllerBasedStatusBarAppearance</key> <false/> <key>NSLocationWhenInUseUsageDescription</key> <string></string> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> </dict> </plist> 

对于真正的生产就绪解决scheme, https://stackoverflow.com/a/36368360/5943130该解决scheme更&#x597D;

这是因为iOS 9中的新的应用程序传输安全性(ATS)function(也是8.4)所致。 ATS已经到位,确保您的应用程序符合安全连接的最佳实践。 如果你遇到这个错误,这意味着你没有使用一个安全的连接,你应该做一些这方面的事情。

但是,您可以通过编辑应用程序的Info.plist文件来覆盖默认行为。

有许多不同的标志可以设置,并且都在苹果官方技术文档中描述。

可以让您closuresATS的最简单的修改是以下一个:

  1. 在Xcode中打开你的项目
  2. 在左侧列出您的项目的所有文件,searchInfo.plist
  3. 右键单击该文件并selectOpen as > Source Code
  4. 将以下代码添加到第一个<dict>标记下

如果你计划发布你的应用,你真的应该真的不把这个留在这里。

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

据我可以告诉你不能在Web XHR中这样做,所以React Native不会公开它。 我已经通过源代码检查,似乎证实了这一点。