2015-09-06 20 views
31

Tôi hiện đang làm việc trên Xcode 7 beta 6. Tôi đang cố gắng để gửi một yêu cầu "DELETE" để http://mySubdomain.herokuapp.comBảo mật Giao thông vận tải ứng dụng Xcode 7 beta 6

Các lỗi tôi nhận được là:

App Giao thông vận tải An ninh đã chặn một HTTP cleartext (http: //) tải tài nguyên vì nó là không an toàn. Các ngoại lệ tạm thời có thể được định cấu hình thông qua tệp Info.plist của ứng dụng của bạn.
Lỗi khi thực hiện cuộc gọi API: Tên miền lỗi = NSURLErrorDomain Code = -1022 Không thể tải tài nguyên vì chính sách Bảo mật chuyển tải ứng dụng yêu cầu sử dụng kết nối an toàn.
NSLocalizedDescription = Tài nguyên không thể được nạp bởi vì chính sách App Giao thông vận tải An ninh đòi hỏi việc sử dụng một kết nối an toàn, NSUnderlyingError = 0x796f7ef0. {Lỗi miền = kCFErrorDomainCFNetwork Mã = -1022 "(null)"}}

Trong cuộc gọi API thực tế của tôi, tôi đặt "https" thay vì "http" và thực sự đã làm việc cho các yêu cầu POST của tôi. Nhưng yêu cầu DELETE ném lỗi trên.

Tôi đã xem các giải pháp ở đây liên quan đến tệp pList, nhưng không có giải pháp nào trong số họ đã làm việc cho tôi. Tôi đã liệt kê các nỗ lực của mình bên dưới.

nỗ lực đầu tiên:

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

Second try:

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

Và cuối cùng, tôi thậm chí đặt tất cả các phím này tạm thời trong như vậy:

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

Tất cả không có may mắn! Tôi luôn gặp lỗi tương tự. Yêu cầu DELETE được định dạng đúng bởi vì khi tôi làm thủ công từ Postman, tôi nhận được kết quả mong muốn.

Đây là những gì phương pháp gọi API thực tế của tôi trông như thế nào, chỉ trong trường hợp có thể có một vấn đề ở đây:

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() 
    } 

Một lần nữa, tôi đang sử dụng Xcode 7 beta 6.

VỀ CHỌN ĐÁP MY Câu trả lời tôi chọn là đúng là phù hợp với tôi vì tôi đã làm tất cả những thay đổi này vào file plist sai trong dự án của tôi và trả lời rằng là người duy nhất mà giải quyết khả năng. Các giải pháp được cung cấp bởi các câu trả lời khác không sai, vì vậy bất kỳ người nào khác gặp phải vấn đề này nên cho họ một thử, vì chúng là hợp lệ. Tôi hy vọng điều này sẽ giúp mọi người có vấn đề tương tự.

+0

Hướng dẫn Để kiểm tra sự chấp nhận của URL Web có sẵn https://medium.com/@Mrugraj/app-transport-security-b7910c4fc70f. điều này có thể giúp hiểu cho tương lai – Mrug

+0

Công việc cố gắng đầu tiên trong trường hợp của tôi theo bất kỳ cách nào tôi tìm thấy nó hữu ích vì vậy tôi có ngón tay cái lên cho u –

Trả lời

12

Tôi cũng gặp sự cố khi ghi đè Bảo mật truyền tải ứng dụng sau khi nâng cấp lên xCode 7.0 và thử các loại giải pháp tương tự mà bạn không có kết quả. Sau khi rời khỏi nó một thời gian, tôi nhận thấy rằng tôi đã thực hiện các thay đổi đối với Info.plist trong phần Hỗ trợ các tệp của "MyAppName Tests" thay vì tệp trong dự án. Thư mục Supporting Files trong dự án của tôi không được mở rộng, vì vậy tôi thậm chí còn không chú ý đến Info.plist trong đó.

Lỗi nghiệp dư điển hình, tôi chắc chắn, nhưng chúng chỉ cách nhau vài bước trong Project Navigator và nó khiến tôi thất vọng cho đến khi tôi nhận thấy sự khác biệt. Nghĩ rằng tôi sẽ đề cập đến nó trong trường hợp bạn gặp vấn đề tương tự.

37

Đánh giá cao bạn đã thử thêm những điều sau đây, để tập tin plist của bạn:

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

... bạn có thể muốn cố gắng thay đổi dòng của bạn:

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

tới:

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

Xin lỗi nếu bạn đã thử cách này.Tôi có thể hiểu làm thế nào bực bội nó là khi bạn nghĩ rằng bạn đã kiệt sức tất cả các con đường.

Nhưng ngay sau khi tôi chạy ứng dụng của tôi trên Xcode 7, để tôi có thể thử nghiệm Apps của chúng tôi, một khởi động với vấn đề "Bảo mật giao thông ứng dụng". Chúng tôi đang sử dụng các dịch vụ web dựa trên Oracle và đã quá muộn trong ngày để bắt đầu định cấu hình chứng chỉ kỹ thuật số cho HTTP dựa trên SSL. Vì vậy, việc bổ sung ở trên vào tập tin plist của tôi đã làm các trick. Đánh giá cao bạn nói bạn đã thử điều này. Nhưng, chỉ để giúp đỡ bất cứ ai khác, nó thực sự làm việc cho tôi. Nó cần phải như tôi không có cách ngay lập tức của việc kích hoạt SSL trên hộp Oracle của chúng tôi.

44

Tôi đã giải quyết nó bằng cách thêm một số khóa trong info.plist. Khi tôi đang sử dụng C mục tiêu cho một số ứng dụng gốc.

Các bước Tôi đi theo là:

  1. Khai trương Dự án của tôi info.plist tập tin

  2. Added Key gọi NSAppTransportSecurity như một Dictionary.

  3. Đã thêm một khóa con được gọi là NSAllowsArbitraryLoads làm Boolean và đặt giá trị của nó thành YES giống như hình ảnh sau đây.

enter image description here

sạch Dự án và Bây giờ Mọi thứ đều chạy tốt như như trước đây.

Ref Link:

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

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

4

tôi đã giải quyết như tập tin plist.
1. Thêm NSAppTransportSecurity : Dictionary.
2. Thêm khóa con có tên NSAllowsArbitraryLoads làm Boolean : YES

Điều này làm việc tốt.

+0

Làm việc cho tôi tốt –

4

Trong Xcode 8

  1. Mở dự án của tôi info.plist tập tin
  2. Thêm khóa gọi AppTransportSecurity như một từ điển.
  3. Thêm khóa con được gọi là AllowsArbitraryLoads làm Boolean và đặt giá trị của nó thành CÓ như hình ảnh sau.

enter image description here

Các vấn đề liên quan