Programing

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

lottogame 2020. 2. 16. 19:15
반응형

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


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

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>

사용주의 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>

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


전송 보안 은 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


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

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

스위프트 4에서는

-> Go Info.plist

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

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

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

-> 임의로드 허용 설정 YES

벨로우즈 이미지

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


plist 파일로 해결했습니다.

NSAppTransportSecurity : Dictionary를 추가하십시오.

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

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


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

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

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

Xcode 8.0 및 swift 3.0 또는 2.2를 사용하는 경우

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


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에서 앱 전송 보안 예외 구성


Xcode 7.1 이상 (swift 2.0)

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


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


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

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


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

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

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

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


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

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


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로 변경 하십시오. 감사.


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

한마디로 :

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


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

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


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

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

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

구성 파일 을 자유롭게 살펴보십시오.


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

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

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


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


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

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

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


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

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

참고 URL : https://stackoverflow.com/questions/32631184/the-resource-could-not-be-loaded-because-the-app-transport-security-policy-requi



반응형