App Transport Security 정책에 보안 연결을 사용해야하므로 리소스를로드 할 수 없습니다


491

Xcode를 7.0 또는 iOS 9.0으로 업데이트 할 때 문제가 발생합니다. 어떻게 든 제목 오류가 발생하기 시작했습니다.

"앱 전송 보안 정책에 보안 연결을 사용해야하므로 리소스를로드 할 수 없습니다."

웹 서비스 방법 :

-(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];

}

서비스가 Xcode 이전 버전 및 iOS 이전 버전에서 제대로 실행되고 있지만 iOS 9.0의 Xcode 7.0으로 업데이트하면 위의 웹 서비스 메소드를 호출 할 때 다음과 같은 문제가 발생하기 시작했습니다. 내가 얻는 로그 오류는 다음과 같습니다.

연결 실패 : 오류 Domain = NSURLErrorDomain 코드 = -1022 "App Transport Security 정책에 보안 연결을 사용해야하므로 리소스를로드 할 수 없습니다." UserInfo = {NSUnderlyingError = 0x7fada0f31880 {오류 도메인 = kCFErrorDomainCFNetwork 코드 = -1022 "(null)"}, NSErrorFailingURLStringKey = MyServiceURL , NSErrorFailingURLKey = MyServiceURL , NSLocalizedDescription = 앱 전송 보안 정책에 보안을 사용해야하므로 리소스를로드 할 수 없습니다 연결.}

다음 질문과 답변을 시도했지만 결과가 나타나지 않습니다. 해당 서비스 호출 오류를 제거하는 방법에 대한 사전 아이디어가 있습니까?

  1. 리소스를로드 할 수 없습니다 : ios9
  2. 앱 전송 보안 Xcode 7 베타 6
  3. https://stackoverflow.com/a/32609970

답변:


935

info.plist에 키를 추가하여 해결했습니다. 내가 따르는 단계는 다음과 같습니다.

  1. 내 프로젝트 대상의 info.plist파일을 열었습니다

  2. 라는 키 추가 NSAppTransportSecurityA와를 Dictionary.

  3. NSAllowsArbitraryLoadsas 라는 하위 키를 추가하고 다음 이미지와 같이 Boolean값을 설정합니다 YES.

여기에 이미지 설명을 입력하십시오

프로젝트를 청소하면 지금처럼 모든 것이 제대로 작동합니다.

참조 링크 : https://stackoverflow.com/a/32609970

편집 : 또는 info.plist파일의 소스 코드에서 다음을 추가 할 수 있습니다.

<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
처음에는 작동하지 않습니다. Project> Target 안에 키를 추가해야합니다
orafaelreis


1
@MihirOza : 예, 전송 보안은 iOS 9의 새로운 기능입니다.
Dominic K

2
예외 도메인이없는 경우 아래에서 아무 키나 제거하면됩니다 NSExceptionDomains. 그렇지 않으면에 예외가 될 것입니다. NSAllowArbitraryLoadshttps를 사용 exception
하여이

7
Xcode 8.3 / Swift 3의 경우 각각 App Transport Security SettingsAllow Arbitrary Loads
Swapna Lekshmanan

280

사용주의 NSAllowsArbitraryLoads = true프로젝트에서는 info.plist모든 서버에 대한 모든 연결이 불안정 할 수 있습니다. 안전하지 않은 연결을 통해 특정 도메인 에만 액세스 할 수있게하려면 다음을 시도하십시오.

여기에 이미지 설명을 입력하십시오

또는 소스 코드로 :

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

편집 후 프로젝트를 정리하고 빌드하십시오.


귀하의 답변에 감사드립니다 단지 NSAllowArbitaryLoads가 작동하지 않았습니다 NSExceptionAllowsInsecureHTTPLoads 추가 트릭
neeta

1
<!-HTTP 요청 허용 포함-> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </ key> <true /> <!-최소 TLS 버전 지정 포함-> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string> LOT도 빠르게로드했습니다.
Sandy D.

참고 : 지금 XCode 8을 사용하고 있습니다.이 작업을 수동으로 수행하는 경우 도메인> 값 유형> 사전을 마우스 오른쪽 단추로 클릭하여 "..AllowsInsecure ..."및 "... IncludesSubdomains"
ArielSD를 추가하십시오.

domain.com 뒤에 포트 번호를 지정하면 작동하지 않습니다. (예 : domain.com:3001)
Shamsiddin 2018 년

43

전송 보안 은 iOS 9.0 이상 및 OS X v10.11 이상에서 제공됩니다.

따라서 기본적으로 https 호출 만 앱에서만 허용됩니다. App Transport Security를 ​​끄려면 info.plist 파일에 다음 줄을 추가 하십시오 ...

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

추가 정보 :
https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33


그러나 여전히 도메인에 대한 HTTP 호출을 허용하지 않습니다. 왜 그런 일이 생길 수 있습니까?
머그잔

HTTP URL이라도 URL shoulb는 검증되었거나 vlid SSL 인증서가 있어야합니다.
Teja Kumar Bethina

35

iOS 10.x 및 Swift 3.x (버전도 지원됨)의 경우 'info.plist'에 다음 줄을 추가하십시오.

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

1
10.x 및 Swift 3.x의 경우 키가 실제로 AppTransportSecurity 및 AllowsArbitraryLoads이지만 잘못되었습니다. NS 접두사는 Swift 3.x에서도 이러한 키에 여전히 필요합니다. 이 키에 NS 접두사를 사용하면 오류가 사라졌습니다.
Jazzmine

27

스위프트 4에서는

-> Go Info.plist

-> 정보 속성 목록의 더하기 클릭

-> 앱 전송 보안 설정 을 사전으로 추가

-> 클릭 플러스 아이콘 앱 전송 보안 설정

-> 임의로드 허용 설정 YES

벨로우즈 이미지

여기에 이미지 설명을 입력하십시오


23

plist 파일로 해결했습니다.

NSAppTransportSecurity : Dictionary를 추가하십시오.

"NSAllowsArbitraryLoads"라는 하위 키를 부울로 추가 : YES

여기에 이미지 설명을 입력하십시오


18

App Transport Security 정책에 Swift 4.03에서 작동하는 보안 연결을 사용해야하므로 리소스를로드 할 수 없습니다.

pList.info를 소스 코드로 열고 붙여 넣기 :

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

13

Apple 문서에서

새로운 앱을 개발하는 경우 HTTPS를 독점적으로 사용해야합니다. 기존 앱이있는 경우 지금 가능한 한 HTTPS를 사용하고 가능한 한 빨리 나머지 앱을 마이그레이션하기위한 계획을 세워야합니다. 또한 상위 레벨 API를 통한 통신은 순방향 보안이있는 TLS 버전 1.2를 사용하여 암호화해야합니다. 이 요구 사항을 따르지 않는 연결을 시도하면 오류가 발생합니다. 앱이 안전하지 않은 도메인을 요청해야하는 경우 앱의 Info.plist 파일에서이 도메인을 지정해야합니다.

앱 전송 보안을 우회하려면

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

모든 안전하지 않은 도메인을 허용하려면

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

더 읽기 : iOS 9 및 OSX 10.11에서 앱 전송 보안 예외 구성




9

이것은 애플의 api에 대한 보안을 강화하는 방법입니다 (http를 통해 https를 사용해야 함). 이 보안 설정을 제거하는 방법을 설명하겠습니다.


여기에 대한 대부분의 답변은이 키를 정보에 추가하는 것을 지적합니다. 여기에 이미지 설명을 입력하십시오

이것만으로는이 문제를 해결하지 못했습니다. 내부에 동일한 키를 추가해야했습니다.

Project -> Targets -> Info -> Custom iOS Target Properties 여기에 이미지 설명을 입력하십시오


그러나 모든 사람으로부터 안전하지 않은 연결이 발생할 수 있습니다. 특정 도메인 만 비보안 연결을 사용하도록하려면 info.plist에 다음을 추가 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


고마워, 이것은 나를 위해 일했다! 작동하지 않은 plist 파일 만 편집했습니다. 나는 다른 사람들이 어떻게 그렇게 작동하게했는지 놀랐습니다
jones

8

URL에서 HTTP가 아닌 HTTPS를 사용하기 만하면 작동합니다.


3
물론, Apple이 자체 서명 된 인증서를 좋아하지 않기 때문에 HTTPS를 사용할 수없는 경우가 아닙니다. 그 문제가 없습니까?
Tony B

1
필자의 경우 HTTPS로 변경 한 후 완벽하게 작동합니다.
pierre23

1
그러나 자체 서명 또는 CA 서명 인증서를 사용합니까? 그냥 궁금해서 물론 별도의 문제가 있지만 물어 볼 것이라고 생각했습니다.
Tony B

나는 서버 측에서 일하지 않았고, 나는 정직한 것을 모른다 :(
pierre23

일부 서버 환경 (공유 호스팅)에서 HTTPS 연결을 설정하는 것이 어려울 수 있습니다.
랩터

7

XML을 좋아하지 않는다면 plist 파일에 아래 태그를 추가하십시오.

여기에 이미지 설명을 입력하십시오


5

iOS 9는 개발자가 App Transport Security를 독점적 으로 사용하도록 할 수 있습니다 . 나는 이것을 무작위로 어딘가에 들었으므로 이것이 사실인지 알 수 없다. 그러나 나는 그것을 의심 하고이 결론에 도달했습니다.

iOS 9에서 실행되는 앱은 더 이상 SSL없이 Meteor 서버에 연결되지 않습니다.

이것은 유성 실행 ios 또는 유성 실행 ios 장치가 더 이상 작동하지 않을 것임을 의미합니다.

앱의 info.plist에서 NSAppTransportSecurity [Dictionary]NSAllowsArbitraryLoads [Boolean]를 설정 YES하거나 Meteor가 곧 사용해야 https합니다 localhost server.


5

Xcode 8.0 ~ 8.3.3 및 신속한 2.2 ~ 3.0을 사용하는 경우

제 경우에는 URL http : // 에서 https : // 로 변경해야합니다 (작동하지 않으면 시도하십시오)

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

여기에 이미지 설명을 입력하십시오


3

pList.info소스 코드 로 열고 맨 아래에서 </dict>다음 코드 를 추가하십시오.

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

마지막으로 your.domain.com기본 URL로 변경 하십시오. 감사.


3

localhost에서 개발하는 사람들은 다음 단계를 따르십시오.

  1. 옆에있는 "+"버튼을 누르고 유형을 Information Property List추가 App Transport Security Settings하고 할당하십시오Dictionary
  2. 새로 만든 App Transport Security Settings항목 옆의 "+"버튼을 누르고 NSExceptionAllowsInsecureHTTPLoads유형을 추가 Boolean하고 값을로 설정하십시오 YES.
  3. NSExceptionAllowsInsecureHTTPLoads항목을 마우스 오른쪽 단추로 클릭하고 "Shift Row Right"옵션을 클릭하여 위 항목의 하위 항목으로 만드십시오.
  4. NSExceptionAllowsInsecureHTTPLoads항목 옆의 "+"버튼을 누르고 Allow Arbitrary Loads유형을 추가 Boolean하고 값을YES

참고 : 결국 다음 그림과 같이 보일 것입니다.

여기에 이미지 설명을 입력하십시오


2

언급 한 많은 옵션을 조합 하여이 문제를 해결했습니다. 이 작업을 수행하기 위해해야 ​​할 모든 일에 대한 체크리스트를 포함하겠습니다.

한마디로 :

  1. NSAllowsArbitraryLoads시계 확장 프로그램 (시계 앱이 아닌)에 대해 true로 설정 합니다.
  2. 내가 사용 https하고 있는지 확인하십시오 http.

1 단계 :

먼저 가장 분명하게 나는 부울로 true로 설정된 하위 키를 사용하여 NSAppTransportSecurity시계 확장에서 사전으로 키 를 추가해야했습니다 . 시계 앱의 plist가 아니라 시계 확장 에서만 설정하십시오. 이로 인해 모든 연결이 허용되고 안전하지 않을 수 있습니다.info.plistNSAllowsArbitraryLoads

여기에 이미지 설명을 입력하십시오

또는

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

2 단계 :

그런 다음로드하려고하는 URL이 https아니어야 http합니다. 여전히 http 인 URL의 경우 다음을 사용했습니다.

스위프트 :

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

Obj-C :

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


2

올바른 info.plist 파일을 변경하십시오 .

이것은이다 두 번째로 내가 MyProjectNameUITests에서의 Info.plist를 변경하고있어 것을 통지하지 않았기 때문에,이 문제에 대한 I의 시간을 낭비.


1

firebase를 사용 NSAllowsArbitraryLoadsInWebContent = true하면 NSAppTransportSecurity섹션에 추가 되어 NSAllowsArbitraryLoads = true작동하지 않습니다.


이 정보에 감사드립니다. 문제 해결 시간을 절약했습니다.
pAkY88

0

"NSAllowsArbitraryLoads"옵션 대신 1 년 서명 된 인증서를 사용하는 자체 호스팅 된 구문 분석 서버의 경우이 문제를 해결했습니다.

임의의 node.js 서버로 서버를 구문 분석 하면 지정해야하는 공개 https URL 이 표시됩니다. 예를 들어 :

parse-server --appId --masterKey --publicServerURL https : //your.public.url/some_nodejs

구성 파일을 살펴보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.