代码之家  ›  专栏  ›  技术社区  ›  Manab Kumar Mal

无法加载资源,因为应用程序传输安全策略要求使用安全连接

  •  583
  • Manab Kumar Mal  · 技术社区  · 9 年前

    当我将Xcode更新到7.0或iOS 9.0时,我面临这个问题。 不知怎么的,它开始给我一个标题错误

    “无法加载资源,因为应用程序传输安全 策略要求使用安全连接“

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

    该服务在Xcode早期版本和iOS早期版本中运行良好,但当我更新到iOS 9.0上的Xcode 7.0时,当我调用上述web服务方法时,它开始给我以下问题。我收到的记录错误是:

    连接失败:错误域=NSURLErrorDomain Code=-1022“ 无法加载资源,因为应用程序传输安全策略 需要使用安全连接。“ 用户信息={NSUnderlyingError=0x7fada0f331880{错误 域=kCFErrorDomainCF网络代码=-1022“(空)”}, NSErrorFailingURLString密钥= 我的服务URL , NSErrorFailingURLKey= 我的服务URL , NSLocalizedDescription=无法加载资源,因为 应用程序传输安全策略要求使用安全 连接。}

    我已经尝试了以下问题和答案,但没有得到任何结果,是否有任何进一步的想法可以消除服务呼叫错误?

    1. The resource could not be loaded is ios9
    2. App Transport Security Xcode 7 beta 6
    3. https://stackoverflow.com/a/32609970
    24 回复  |  直到 9 年前
        1
  •  1070
  •   Manab Kumar Mal    4 年前

    我已经通过在info.plist中添加一些键解决了这个问题。 我遵循的步骤是:

    1. 打开了我的项目目标 info.plist 文件

    2. 添加了名为的密钥 NSAppTransportSecurity 作为一个 Dictionary .

    3. 添加了名为 NSAllowsArbitraryLoads Boolean 并将其值设置为 YES 如下图所示。

    enter image description here

    清理项目,现在一切都像以前一样正常。

    参考链接: https://stackoverflow.com/a/32609970

    编辑: 或在源代码中 信息.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>
    
        2
  •  319
  •   TheNeil    5 年前

    注意,使用 NSAllowsArbitraryLoads = true 在项目的 info.plist 允许与任何服务器的所有连接都是不安全的。如果您想确保 特定域 无法通过不安全的连接访问,请尝试以下操作:

    enter image description here

    或者,作为源代码:

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

    清洁&编辑后生成项目。

        3
  •  58
  •   Cœur tomoc4    7 年前

    运输安全 在iOS 9.0或更高版本以及OS X v10.11和更高版本中提供。

    所以默认情况下 https 仅允许在应用中调用。要关闭应用程序传输安全性,请在中添加以下行 信息.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

        4
  •  39
  •   Mr. Bean    7 年前

    对于iOS 10.x和Swift 3.x(也支持以下版本),只需在“info.plist”中添加以下行

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
        5
  •  36
  •   Enamul Haque    6 年前

    在Swift 4中,您可以使用

    ->转到信息.plist

    ->单击信息属性列表的加号

    ->添加 应用程序传输安全设置 作为字典

    ->单击加号图标 应用程序传输安全设置

    ->添加 允许任意加载 设置

    波纹管图像看起来像

    enter image description here

        6
  •  24
  •   Avinash651    9 年前

    我已经解决了plist文件。

    添加NSAppTransportSecurity:字典。

    将名为“NSAllowsArbitraryLoads”的子项添加为布尔值:是

    enter image description here

        7
  •  19
  •   Pang Mohammad Imran    6 年前

    无法加载资源,因为App Transport Security策略要求使用在Swift 4.03中工作的安全连接。

    打开pList。信息作为源代码并粘贴:

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
        8
  •  19
  •   Sam    4 年前

    这是苹果对你的api强制加强安全的方式(强制使用https over http)。我将解释如何删除此安全设置。


    这里的大多数答案都指出将此密钥添加到info.plist中 enter image description here

    单凭这一点并不能解决我的问题。 我必须在里面加上同样的钥匙

    Project -> Targets -> Info -> Custom iOS Target Properties enter image description here


    然而,这将允许任何人进行不安全的连接。如果只允许特定域使用不安全连接,可以将以下内容添加到info.plist中。

    enter image description here

        9
  •  13
  •   Ashok R    7 年前

    来自Apple文档

    如果你在开发一个新的应用程序,你应该专门使用HTTPS。如果你有一个现有的应用程序,你应该尽可能多地使用HTTPS,并尽快创建一个迁移应用程序其余部分的计划。此外,您通过更高级别API的通信需要使用TLS 1.2版本进行加密,并具有转发保密性。如果尝试建立不符合此要求的连接,则会引发错误。如果您的应用程序需要向不安全的域发出请求,则必须在应用程序的信息中指定该域。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>
    

    阅读更多: Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11

        10
  •  11
  •   Anit Kumar    8 年前

    如果您使用的是Xcode 8.0和swift 3.0或2.2

    enter image description here

        11
  •  9
  •   Alvin George    8 年前

    Xcode 7.1及以后版本(swift 2.0)

    enter image description here

        12
  •  9
  •   Amit Baderia    3 年前

    在XCode 12.5.IOS 14.中,我做了以下条目

    enter image description here

    这就是信息。plist源代码看起来像

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
        13
  •  7
  •   MrWaqasAhmed    7 年前

    如果您不是XML的狂热爱好者,那么只需在plist文件中添加以下标记即可。

    enter image description here

        14
  •  5
  •   Mihir Oza    8 年前

    iOS 9(可能)迫使开发者使用 应用程序传输安全 唯一地我在某个地方无意中听到了这句话,所以我自己也不知道这句话是否属实。但我怀疑这一点,并得出了这样的结论:

    在iOS 9上运行的应用程序将(可能)不再连接到没有SSL的Meteor服务器。

    这意味着运行流星运行ios或流星运行ios设备将(可能?)不再工作。

    在应用程序的info.plist中, NSAppTransportSecurity [Dictionary] 需要一把钥匙 NSAllowsArbitraryLoads [Boolean] 将设置为 YES 或Meteor需要使用 https 对于其 localhost server 很快

        15
  •  5
  •   Md Imran Choudhury    7 年前

    如果您使用的是Xcode 8.0至8.3.3和swift 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
    

    enter image description here

        16
  •  5
  •   ISS    5 年前

    对于在本地主机上开发的用户,请遵循以下步骤:

    1. 点击旁边的“+”按钮 Information Property List 并添加 App Transport Security Settings 并为其分配 Dictionary 类型
    2. 点击新建项目旁边的“+”按钮 应用程序传输安全设置 输入和添加 NSExceptionAllowsInsecureHTTPLoads 类型的 Boolean 并将其值设置为 YES .
    3. 右键单击 NSExceptionAllowsInsecureHTTPLoad 条目,然后单击“向右移动行”选项,使其成为上述条目的子项。
    4. 点击 NSExceptionAllowsInsecureHTTPLoad 输入和添加 Allow Arbitrary Loads 类型的 布尔型 并将其值设置为

    注意:最后看起来应该像下图所示

    enter image description here

        17
  •  4
  •   pierre23    9 年前

    您只需要在URL中使用HTTPS而不是HTTP,它就会起作用

        18
  •  4
  •   Pang Mohammad Imran    6 年前

    确保您更改了正确的信息。plist文件 .

    这是 第二次 我在这个问题上浪费时间,因为我没有注意到我在改变信息。plist在MyProjectNameUITests下。

        19
  •  3
  •   cn00    4 年前

    如果你使用firebase,它将添加 NSAllowsArbitraryLoadsInWebContent = true NSAppTransportSecurity 第节,以及 NSAllowsArbitraryLoads = true 不起作用

        20
  •  2
  •   Gordonium    8 年前

    我结合了上述许多选项,设法解决了这个问题。我会附上一份清单,其中列出了我为使这项工作发挥作用而必须做的所有事情。

    简而言之:

    1. 设置 NSAllowsArbitraryLoads 对于我的手表扩展(而不是我的手表应用),设置为true。
    2. 确保我正在使用 https 而不是 http .

    第一步:

    首先,最明显的是,我必须添加一个 NSAppTransportSecurity key作为手表扩展中的字典 info.plist 具有名为 NSallows轨道荷载 作为设置为true的布尔值。 只有 在手表扩展中设置此项,而不是在手表应用plist中设置。尽管要注意,这允许所有连接,并且可能不安全。

    enter image description here

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

    第二步:

    然后我必须确保我试图加载的url是 https 而不仅仅是 http 。对于仍然是http的任何URL,我使用:

    敏捷的 :

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

    目标C:

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

        21
  •  2
  •   Najam    6 年前

    打开您的 p列表信息 源代码 在底部之前 </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。谢谢

        22
  •  1
  •   yerlilbilgin    2 年前

    对于XCode 13,添加 Allow Arbitrary Loads 这不是一件微不足道的工作。因为默认情况下没有名为 App Transport Security Settings .

    您必须了解如何添加新的根级别键,方法是按下Info/Custom iOS Target Properties(信息/自定义iOS目标属性)下的任何加号按钮。

    请参阅此链接中的详细信息:

    https://stackoverflow.com/a/72400983/1644618

        23
  •  0
  •   CyrIng    8 年前

    我已经解决了这个问题,在自托管解析服务器使用一年签名证书而不是“NSAllowsArbitraryLoads”选项的情况下

    将服务器解析为任意节点。js服务器提供了 公共https url 您必须指定。例如:

    解析服务器--appId--masterKey--publicServerURL https://your.public.url/some_nodejs

    随便看看我的 configuration files

        24
  •  0
  •   Rizwan    2 年前

    建议使用 https 仅在应用程序中调用。iOS 9.0中引入了传输安全,仅允许 https 默认情况下,来自应用程序的调用。

    但是,如果您仍然希望允许所有非 https 电话- 添加 NSAppTransportSecurity (字典)在信息中。plist和 添加名为的子项 NSAllowsArbitraryLoads 布尔值为YES。 更新后,plist应该如下所示

    enter image description here

    步骤

    • 打开Info.plist
    • 点击 + 在“信息属性”列表下
    • 添加应用传输安全设置( NSAppTransportSecurity公司 )作为字典
    • 点击 + 添加的应用程序传输安全设置不足
    • 添加允许任意加载( NSallows轨道荷载 )作为布尔值,并将值设置为YES