簡體   English   中英

如果ssl(https)證書無效,則React Native XMLHttpRequest請求將失敗

[英]React Native XMLHttpRequest request fails if ssl (https) certificate is not valid

當我正在使用無效證書的https服務器執行XMLHttpRequest時,React Native會拋出異常“操作無法完成。(NSURLErrorDomain error -1202。)”

是否可以禁用對React Native XMLHttpRequest的ssl警告/檢查?

免責聲明:此解決方案應該是臨時的並記錄在案,以便它不會停留在軟件的生產階段,這僅用於開發。

對於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,左鍵單擊它並選擇打開為...源代碼。

最后加入

<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>

對於真正的生產就緒解決方案, https://stackoverflow.com/a/36368360/5943130該解決方案更好

這是因為iOS 9中的新App Transport Security(ATS)功能(以及8.4)。 ATS已經到位,請確保您的應用符合安全連接的最佳做法。 如果您遇到此錯誤,則意味着您沒有使用安全連接,而您應該對此做些什么。

但是,您可以通過編輯應用程序的Info.plist文件來覆蓋默認行為。

您可以設置許多不同的標志,它們都在Apple官方技術說明中描述。

最簡單的修改可以讓你一起關閉ATS,如下所示:

  1. 在Xcode中打開您的項目
  2. 在左側,列出項目的所有文件,搜索Info.plist
  3. 右鍵單擊該文件,然后選擇Open as > Source Code
  4. 將以下代碼添加到第一個<dict>標記下

如果你計划發布你的應用程序,你真的真的不應該留在這里。

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

據我所知,你不能在web XHR中做到這一點,所以React Native不會暴露它。 我已經檢查了源代碼,似乎證實了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM