Không thể tải tài nguyên vì chính sách Bảo mật vận chuyển ứng dụng yêu cầu sử dụng kết nối an toàn


491

Tôi đang đối mặt với Sự cố khi tôi đã cập nhật Xcode của mình lên 7.0 hoặc iOS 9.0. Bằng cách nào đó nó bắt đầu cho tôi lỗi Tiêu đề

"Không thể tải tài nguyên vì chính sách Bảo mật vận chuyển ứng dụng yêu cầu sử dụng kết nối an toàn"

Phương pháp dịch vụ web:

-(void)ServiceCall:(NSString*)ServiceName :(NSString *)DataString
{
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setAllowsCellularAccess:YES];
    [sessionConfiguration setHTTPAdditionalHeaders:@{ @"Accept" : @"application/json" }];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",ServiceURL]];
    NSLog(@"URl %@%@",url,DataString);
    // Configure the Request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:[NSString stringWithFormat:@"%@=%@", strSessName, strSessVal] forHTTPHeaderField:@"Cookie"];
    request.HTTPBody = [DataString dataUsingEncoding:NSUTF8StringEncoding];
    request.HTTPMethod = @"Post";

    // post the request and handle response
    NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
                                          {
                                              // Handle the Response
                                              if(error)
                                              {
                                                  NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);

                                                  // Update the View
                                                  dispatch_async(dispatch_get_main_queue(), ^{

                                                      // Hide the Loader
                                                      [MBProgressHUD hideHUDForView:[[UIApplication sharedApplication] delegate].window animated:YES];


                                                  });
                                                  return;
                                              }
                                              NSArray * cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:request.URL];
                                              for (NSHTTPCookie * cookie in cookies)
                                              {
                                                  NSLog(@"%@=%@", cookie.name, cookie.value);
                                                  strSessName=cookie.name;
                                                  strSessVal=cookie.value;

                                              }

                                              NSString *retVal = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];
[postDataTask resume];

}

Dịch vụ này đang chạy tốt cho Xcode phiên bản cũ hơn và phiên bản iOS trước Nhưng khi tôi cập nhật lên Xcode 7.0 trên iOS 9.0, nó bắt đầu gặp sự cố như sau khi tôi gọi phương thức dịch vụ web ở trên. Lỗi được ghi lại mà tôi nhận được là:

Kết nối không thành công: Error Domain = NSURLErrorDomain Code = -1022 "Không thể tải tài nguyên vì chính sách Bảo mật vận chuyển ứng dụng yêu cầu sử dụng kết nối an toàn." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Lỗi miền = kCFErrorDomainCFNetwork Mã = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , 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 an toàn kết nối.}

Tôi đã thử theo dõi Câu hỏi và câu trả lời nhưng không nhận được kết quả nào ở đó, có ý tưởng nào trước về cách tôi có thể xóa lỗi cuộc gọi dịch vụ đó không?

  1. Tài nguyên không thể tải được là ios9
  2. Ứng dụng bảo mật vận tải Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

bản sao có thể có của App Transport Security Xcode 7 beta 6
AiOsN

Câu trả lời:


935

Tôi đã giải quyết nó bằng cách thêm một số khóa trong info.plist. Các bước tôi làm theo là:

  1. Đã mở info.plisttệp mục tiêu dự án của tôi

  2. Đã thêm một khóa được gọi NSAppTransportSecuritylà a Dictionary.

  3. Đã thêm một Subkey được gọi là NSAllowsArbitraryLoadsas Booleanvà đặt giá trị của nó YESthành như hình ảnh sau đây.

nhập mô tả hình ảnh ở đây

Làm sạch dự án và bây giờ mọi thứ đang chạy tốt như trước đây.

Liên kết giới thiệu: https://stackoverflow.com/a/32609970

EDIT: HOẶC Trong mã nguồn của info.plisttệp, chúng ta có thể thêm rằng:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSExceptionDomains</key>
        <dict>
            <key>yourdomain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
       </dict>
  </dict>

5
Lúc đầu nó không hoạt động. Bạn cần thêm các khóa bên trong Project> Target quá
orafaelreis

4
Dưới đây là một số tài liệu hữu ích của nhà phát triển
Apple.apple.com / l Library / ios / document / General / Reperence / từ

1
@MihirOza: Đúng, bảo mật vận chuyển là một tính năng mới của iOS 9.
Dominic K

2
Nếu bạn không có tên miền ngoại lệ, chỉ cần xóa bất kỳ khóa nào bên dưới NSExceptionDomains. Nếu không, đó sẽ là một ngoại lệ NSAllowArbitraryLoads, sau đó bạn phải sử dụng https để truy cập trang nàyexception
DawnSong

7
Đối với Xcode 8.3 / Swift 3 App Transport Security Settings, Allow Arbitrary Loadstương ứng
Swapna Lekshmanan

280

Hãy lưu ý, sử dụng NSAllowsArbitraryLoads = truetrong dự án info.plistcho phép tất cả kết nối đến bất kỳ máy chủ nào không an toàn. Nếu bạn muốn đảm bảo chỉ có một tên miền cụ thể có thể truy cập được thông qua kết nối không an toàn, hãy thử điều này:

nhập mô tả hình ảnh ở đây

Hoặc, dưới dạng mã nguồn:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>domain.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Dự án Clean & Build sau khi chỉnh sửa.


cảm ơn vì câu trả lời của bạn chỉ NSAllowArbitaryLoads không làm việc cho tôi thêm NSExceptionAllowsInsecureHTTPLoads đã làm các trick
Neeta

1
Tôi cũng đã thêm hai khóa này: <! - Bao gồm để cho phép các yêu cầu HTTP -> <key> NST tạmException ALLowsInsecureHTTPLoads </ key> <true /> <! - Bao gồm để chỉ định phiên bản TLS tối thiểu -> <key> NST tạmExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string> Nó cũng khiến nó tải RẤT nhanh hơn.
Sandy D.

Lưu ý: Hiện tôi đang sử dụng XCode 8: Nếu bạn đang thực hiện việc này một cách thủ công, hãy đảm bảo nhấp chuột phải vào tên miền> Loại giá trị> Từ điển để thêm ".. ALLowsInsecure ..." và "... Bao gồm các tên miền"
ArielSD

Không hoạt động nếu tôi chỉ định số cổng sau domain.com. (domain.com:3001 chẳng hạn)
Shamsiddin

43

Bảo mật vận chuyển được cung cấp trong iOS 9.0 trở lên và trong OS X v10.11 trở lên.

Vì vậy, theo mặc định, chỉ các cuộc gọi https chỉ được phép trong ứng dụng. Để tắt App Transport Security, hãy thêm các dòng sau vào tệp info.plist ...

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

Để biết thêm thông tin:
https://developer.apple.com/l Library / content / document / General / Reference / InfoPlistKeyReference / Articles / CocoaKeys.html # / //ple_Vf / doc / uid / TP40009251-WW33


Nhưng, điều này vẫn không cho phép tôi thực hiện cuộc gọi HTTP đến bất kỳ miền nào. Có manh mối tại sao nó xảy ra?
Mrug

Ngay cả URL HTTP, shoulb URL cũng được xác minh hoặc phải có chứng chỉ SSL vlid.
Teja Kumar Bethina

35

Đối với iOS 10.x và Swift 3.x [các phiên bản bên dưới cũng được hỗ trợ] chỉ cần thêm các dòng sau vào 'info.plist'

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

1
Đối với 10.x và Swift 3.x, tôi đã thấy các khóa khác thực sự là AppTransportSecurity và allowArbitraryLoads nhưng chúng đã sai. tiền tố NS vẫn cần thiết cho các khóa này, ngay cả đối với Swift 3.x. Lỗi đã biến mất khi tôi dựa vào tiền tố NS cho các khóa này.
Jazzmine

27

Trong Swift 4 Bạn có thể sử dụng

-> Truy cập Info.plist

-> Nhấp vào cộng với danh sách thuộc tính Thông tin

-> Thêm cài đặt bảo mật vận chuyển ứng dụng làm từ điển

-> Nhấp vào biểu tượng Plus Cài đặt bảo mật ứng dụng vận chuyển

-> Thêm cho phép tải tùy ý đặt

Hình ảnh dưới đây trông giống như

nhập mô tả hình ảnh ở đây


23

Tôi đã giải quyết như tập tin plist.

Thêm một NSAppTransportSecurity: Dictionary.

Thêm Subkey có tên "NS ALLowsArbitraryLoads" dưới dạng Boolean: CÓ

nhập mô tả hình ảnh ở đây


18

Không thể tải tài nguyên vì chính sách Bảo mật vận chuyển ứng dụng yêu cầu sử dụng kết nối an toàn hoạt động trong Swift 4.03.

Mở pList.info của bạn dưới dạng mã nguồn và dán:

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

13

Từ tài liệu của Apple

Nếu bạn đang phát triển một ứng dụng mới, bạn nên sử dụng riêng HTTPS. Nếu bạn có một ứng dụng hiện có, bạn nên sử dụng HTTPS càng nhiều càng tốt ngay bây giờ và tạo một kế hoạch để di chuyển phần còn lại của ứng dụng càng sớm càng tốt. Ngoài ra, thông tin liên lạc của bạn thông qua API cấp cao hơn cần được mã hóa bằng TLS phiên bản 1.2 với tính bảo mật chuyển tiếp. Nếu bạn cố gắng tạo một kết nối không tuân theo yêu cầu này, sẽ xảy ra lỗi. Nếu ứng dụng của bạn cần yêu cầu một miền không an toàn, bạn phải chỉ định miền này trong tệp Info.plist của ứng dụng.

Để bỏ qua bảo mật ứng dụng vận tải:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Để cho phép tất cả các miền không an toàn

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

Đọc thêm: Định cấu hình ngoại lệ bảo mật vận chuyển ứng dụng trong iOS 9 và OSX 10.11



9

Trong Xcode 7.1 trở đi (swift 2.0)

nhập mô tả hình ảnh ở đây


9

Đây là cách của Apple để buộc bảo mật chặt chẽ hơn trên apis của bạn (buộc phải sử dụng https qua http). Tôi sẽ giải thích cách xóa cài đặt bảo mật này.


Hầu hết các câu trả lời ở đây chỉ ra việc thêm khóa này vào thông tin của bạn. nhập mô tả hình ảnh ở đây

Điều này một mình không giải quyết vấn đề này cho tôi. Tôi đã phải thêm cùng một khóa vào bên trong

Project -> Targets -> Info -> Custom iOS Target Properties nhập mô tả hình ảnh ở đây


Điều này sẽ cho phép các kết nối không an toàn xảy ra từ bất cứ ai. Nếu bạn muốn chỉ cho phép một tên miền cụ thể sử dụng tạo các kết nối không an toàn, bạn có thể thêm thông tin sau vào thông tin của mình.

nhập mô tả hình ảnh ở đây


Cảm ơn, điều này đã làm việc cho tôi! Tôi chỉ chỉnh sửa tập tin plist trước đó không hoạt động. Tôi ngạc nhiên về cách những người khác làm cho nó hoạt động theo cách đó
jones

8

Bạn chỉ cần sử dụng HTTPS chứ không phải HTTP trong URL của mình và nó sẽ hoạt động


3
Tất nhiên trừ khi bạn không thể sử dụng HTTPS vì Apple không thích chứng nhận tự ký. Bạn không có vấn đề đó?
Tony B

1
Trong trường hợp của tôi, nó hoạt động hoàn hảo kể từ khi tôi đổi thành HTTPS
pierre23

1
nhưng bạn có sử dụng chứng chỉ tự ký hoặc CA đã ký không? Chỉ tò mò thôi. Tất nhiên là một vấn đề riêng biệt, nhưng tôi sẽ hỏi.
Tony B

Tôi đã không làm việc ở phía máy chủ, tôi không biết trung thực :(
pierre23

Thiết lập kết nối HTTPS trên một số môi trường máy chủ (lưu trữ chia sẻ) có thể khó khăn.
Raptor

7

Nếu bạn không phải là một fan hâm mộ lớn của XML, thì chỉ cần thêm thẻ bên dưới vào tệp plist của bạn.

nhập mô tả hình ảnh ở đây


5

iOS 9 (có thể) buộc các nhà phát triển chỉ sử dụng App Transport Security . Tôi tình cờ nghe thấy điều này ở đâu đó một cách ngẫu nhiên vì vậy tôi không biết liệu đây có phải là sự thật không. Nhưng tôi nghi ngờ nó và đã đi đến kết luận này:

Ứng dụng chạy trên iOS 9 sẽ (có thể) không còn kết nối với máy chủ Meteor mà không có SSL.

Điều này có nghĩa là chạy sao băng chạy ios hoặc sao băng chạy ios-device sẽ (có lẽ?) Sẽ không còn hoạt động.

Trong info.plist của ứng dụng, NSAppTransportSecurity [Dictionary]cần phải có một phím NSAllowsArbitraryLoads [Boolean]được thiết lập để YEShoặc Meteor nhu cầu sử dụng httpscho nó localhost serversớm.


5

Nếu bạn đang sử dụng Xcode 8.0 đến 8.3.3 và swift 2.2 đến 3.0

Trong trường hợp của tôi cần thay đổi URL http: // thành https: // (nếu không hoạt động thì hãy thử)

Add an App Transport Security Setting: Dictionary.
Add a NSAppTransportSecurity: Dictionary.
Add a NSExceptionDomains: Dictionary.
Add a yourdomain.com: Dictionary.  (Ex: stackoverflow.com)

Add Subkey named " NSIncludesSubdomains" as Boolean: YES
Add Subkey named " NSExceptionAllowsInsecureHTTPLoads" as Boolean: YES

nhập mô tả hình ảnh ở đây


3

Mở pList.info của bạn dưới dạng Mã nguồn và ở dưới cùng ngay trước khi </dict>thêm mã sau đây,

 <!--By Passing-->
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>your.domain.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>1.0</string>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
    </dict>
    <!--End Passing-->

Và cuối cùng thay đổi your.domain.comvới Url cơ sở của bạn. Cảm ơn.


3

Đối với những người bạn đang phát triển trên localhost, hãy làm theo các bước sau:

  1. Nhấn vào nút "+" bên cạnh Information Property Listvà thêm App Transport Security Settingsvà gán cho nó một DictionaryLoại
  2. Nhấn vào nút "+" bên cạnh App Transport Security Settingsmục nhập vừa tạo và thêm NSExceptionAllowsInsecureHTTPLoadsloại Booleanvà đặt giá trị của nó thành YES.
  3. Nhấp chuột phải vào NSExceptionAllowsInsecureHTTPLoadsmục nhập và nhấp vào tùy chọn "Shift Row Right" để biến nó thành mục con của mục trên.
  4. Nhấn vào nút "+" bên cạnh NSExceptionAllowsInsecureHTTPLoadsmục nhập và thêm Allow Arbitrary Loadsloại Booleanvà đặt giá trị của nó thànhYES

Lưu ý: Cuối cùng, nó sẽ trông giống như được trình bày trong hình dưới đây

nhập mô tả hình ảnh ở đây


2

Tôi quản lý để giải quyết điều này với sự kết hợp của nhiều lựa chọn được đề cập. Tôi sẽ bao gồm một danh sách kiểm tra tất cả những điều tôi phải làm để làm việc này.

Nói ngắn gọn:

  1. Bộ NSAllowsArbitraryLoads thành đúng cho tiện ích mở rộng đồng hồ của tôi (không phải ứng dụng đồng hồ của tôi).
  2. Đảm bảo tôi đã sử dụng httpsvà không http.

Bước một:

Đầu tiên và rõ ràng nhất là tôi phải thêm một NSAppTransportSecuritykhóa làm từ điển trong phần mở rộng đồng hồ của mình info.plistvới một khóa con được gọi NSAllowsArbitraryLoadslà boolean được đặt thành true. Chỉ đặt phần này trong tiện ích mở rộng đồng hồ chứ không phải phần mở rộng của ứng dụng đồng hồ. Mặc dù lưu ý rằng điều này cho phép tất cả các kết nối và có thể không an toàn.

nhập mô tả hình ảnh ở đây

hoặc là

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

Bước hai:

Sau đó, tôi phải đảm bảo rằng url tôi đang cố tải httpsvà không chỉ http. Đối với bất kỳ url nào vẫn là http tôi đã sử dụng:

Swift :

let newURLString = oldURLString.stringByReplacingOccurrencesOfString("http", withString: "https")

Obj-C:

NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];


2

Hãy chắc chắn rằng bạn thay đổi tập tin info.plist đúng .

Đây là lần thứ hai tôi lãng phí thời gian cho vấn đề này, vì tôi đã không nhận thấy rằng tôi đang thay đổi thông tin.plist trong MyProjectNameUITests.


1

Nếu bạn sử dụng firebase, nó sẽ thêm NSAllowsArbitraryLoadsInWebContent = truevào NSAppTransportSecurityphần và NSAllowsArbitraryLoads = truesẽ không hoạt động


Cảm ơn thông tin này. Bạn đã tiết kiệm cho tôi hàng giờ khắc phục sự cố.
pAkY88

0

Tôi đã giải quyết vấn đề này trong trường hợp máy chủ phân tích cú pháp tự lưu trữ bằng chứng chỉ đã ký một năm thay vì tùy chọn "NSAllowsArbitraryLoads"

Parse Server như bất kỳ máy chủ node.js nào trình bày một url https công khai mà bạn phải chỉ định. Ví dụ:

máy chủ phân tích cú pháp --appId --masterKey --publicServerURL https: //your.public.url/some_nodejs

Hãy xem các tập tin cấu hình của tôi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.