簡體   English   中英

應用程序傳輸安全 Xcode 7 beta 6

[英]App Transport Security Xcode 7 beta 6

我目前正在研究Xcode 7 beta 6 我正在嘗試向http://mySubdomain.herokuapp.com發送“刪除”請求

我收到的錯誤是:

App Transport Security 已阻止明文 HTTP (http://) 資源加載,因為它不安全。 可以通過應用程序的 Info.plist 文件配置臨時例外。
進行 API 調用時出錯:錯誤域 = NSURLErrorDomain 代碼 = -1022 無法加載資源,因為應用程序傳輸安全策略需要使用安全連接。
NSLocalizedDescription=無法加載資源,因為應用傳輸安全策略需要使用安全連接。,NSUnderlyingError=0x796f7ef0 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}}

在我的實際 API 調用中,我使用“https”而不是“http”,這實際上適用於我的 POST 請求。 但是 DELETE 請求會引發上述錯誤。

我在這里看到了涉及 pList 文件的解決方案,但沒有一個對我有用。 我在下面列出了我的嘗試。

第一次嘗試:

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

第二次嘗試:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>herokuapp.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

最后,我什至把所有這些臨時密鑰都放在了這樣的地方:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>herokuapp.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSTemporaryThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSTemporaryThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSRequiresCertificateTransparency</key>
                <false/>
                <key>NSTemporaryRequiresCertificateTransparency</key>
                <false/>
            </dict>
        </dict>
    </dict>

一切都沒有運氣! 我總是得到同樣的錯誤。 DELETE 請求的格式正確,因為當我從 Postman 手動執行時,我得到了所需的結果。

這是我實際的 API 調用方法的樣子,以防萬一這里可能出現問題:

class func makeDELETEALLRequest(completion: (error:Bool) -> Void) {
        let session = NSURLSession.sharedSession()
        let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "DELETE"

        let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in

            if (error != nil) {
                print("Error making API call: \(error!)")
                completion(error: true)
            } else {
                let HTTPResponse = response as! NSHTTPURLResponse
                let statusCode = HTTPResponse.statusCode
                if (statusCode == 200){
                    print("Successfully deleted!")
                    completion(error: false)
                } else {
                    print("Different status code: \(statusCode)")
                    completion(error: true)
                }
            }
        }
        task.resume()
    }

我再次使用Xcode 7 beta 6

關於我選擇的答案 我選擇的正確答案對我來說是正確的,因為我在項目中對錯誤的 pList 文件進行了所有這些更改,而該答案是唯一解決這種可能性的答案。 其他答案提供的解決方案沒有錯,因此遇到此問題的任何其他人都應該嘗試一下,因為它們是有效的。 我希望這可以幫助任何有類似問題的人。

我已經通過在 info.plist 中添加一些鍵來解決它。 因為我將目標 C 用於某些本機應用程序。

我遵循的步驟是:

  1. 打開我的項目info.plist文件

  2. 添加了一個名為NSAppTransportSecurity的 Key 作為Dictionary

  3. 添加了一個名為NSAllowsArbitraryLoads的子鍵作為Boolean ,並將其值設置為YES ,如下圖所示。

在此處輸入圖像描述

清理項目,現在一切都像以前一樣運行良好。

參考鏈接:

  1. https://stackoverflow.com/a/32631185/2905967

  2. https://stackoverflow.com/a/32609970

感謝您嘗試將以下內容添加到您的 plist 文件中:

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

...您可能想嘗試更改您的線路:

let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")

至:

let url = NSURL(string:"http://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")

抱歉,如果您嘗試過此操作。 當您認為自己已經用盡所有途徑時,我可以理解這是多么令人沮喪。

但是,當我在 Xcode 7 上運行我的應用程序以便我可以測試我們的應用程序時,一開始就出現了“應用程序傳輸安全”問題。 我們正在使用基於 Oracle 的 Web 服務,現在開始為基於 SSL 的 HTTP 配置數字證書為時已晚。 所以,上面添加到我的 plist 文件中就可以了。 感謝您說您已經嘗試過。 但是,只是為了幫助其他人,它確實對我有用。 它需要,因為我沒有立即在我們的 Oracle 機器上啟用 SSL 的方法。

在升級到 xCode 7.0 后,我也遇到了覆蓋 App Transport Security 的問題,並嘗試了相同類型的解決方案,但都無濟於事。 離開它一段時間后,我注意到我已經對“MyAppName 測試”的支持文件下的 Info.plist 進行了更改,而不是項目本身中的更改。 我項目中的 Supporting Files 文件夾沒有展開,所以我什至沒有注意到其中的 Info.plist。

我敢肯定,這是典型的業余錯誤,但它們在 Project Navigator 中僅相隔幾行,這讓我很沮喪,直到我注意到了區別。 以為我會提到它,以防您遇到同樣的問題。

我已解決為 plist 文件。
1. 添加一個NSAppTransportSecurity : Dictionary
2. 將名為NSAllowsArbitraryLoads的子項添加為Boolean : YES

這運作良好。

在 Xcode 8 和 Xcode 9 中

  1. 打開我的項目 info.plist 文件
  2. 添加一個名為AppTransportSecurity的密鑰作為字典。
  3. 添加一個名為AllowsArbitraryLoads作為布爾值的子項,並將其值設置為 YES,如下圖所示。

在此處輸入圖像描述

對於 XCode 13,我沒有找到任何Info.plist文件,並且從 UI 中添加提到的AppTransportSecurity設置很棘手。

在此處輸入圖像描述

默認情況下, App Transport Security Settings不存在。 您必須牢記按那個 + 按鈕不會添加子項,而是完全添加一個新項。

我知道這聽起來不是那么清晰和聰明,但是如果您單擊那個+按鈕,它會顯示一組與 Bundle 名稱(或任何其他根級別鍵)無關的鍵,但允許您添加新鍵到根級別,包括AppTransportSecurity 如此重要,但這就是他們設計的方式。

因此,它看起來像這樣: 在此處輸入圖像描述

暫無
暫無

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

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