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


490

将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代码= -1022“无法加载资源,因为应用程序传输安全策略需要使用安全连接。” UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork代码= -1022“(null)”},NSErrorFailingURLStringKey = MyServiceURL,NSErrorFailingURLKey = MyServiceURL,NSLocalizedDescription =无法加载资源,因为应用传输安全策略需要使用安全的安全性连接。}

我已经尝试过以下问题和解答,但是没有得到任何结果,是否有任何高级想法可以删除该服务调用错误?

  1. ios9无法加载资源
  2. App Transport Security Xcode 7 Beta 6
  3. https://stackoverflow.com/a/32609970

Answers:


935

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

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

  2. 增加了一个名为关键NSAppTransportSecurityDictionary

  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
起初它不起作用。您需要添加项目>目标内的按键太
orafaelreis


1
@ MihirOza:是的,传输安全是iOS 9的新功能。–
Dominic K

2
如果您没有例外域,只需删除下的任何键NSExceptionDomains。否则它将是的例外NSAllowArbitraryLoads,那么您必须使用https来访问它exception
DawnSong

7
对于Xcode的8.3 /夫特3是App Transport Security SettingsAllow Arbitrary Loads分别
Swapna Lekshmanan

279

请注意,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 2016年

1
我还添加了这两个键:<!-包括以允许HTTP请求-> <key> NSTemporaryExceptionAllowsInsecureHTTPLoads </ key> <true /> <!-包括以指定最低TLS版本-> <key> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 </ string>也使它更快地加载了很多。
桑迪D.16年

注意:我现在正在使用XCode 8:如果您手动执行此操作,请确保右键单击域>“值类型”>“词典”以添加“ ..AllowsInsecure ...”和“ ... IncludesSubdomains”
ArielSD

如果我在domain.com之后指定端口号,则无法正常工作。(例如domain.com:3001)–
Shamsiddin

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调用。有什么线索为什么会发生吗?
Mrug

即使是HTTP URL,该URL也应经过验证或应具有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 '17

27

在Swift 4中,您可以使用

->转到Info.plist

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

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

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

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

波纹管图像看起来像

在此处输入图片说明


23

我已经解决为plist文件。

添加一个NSAppTransportSecurity:字典。

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

在此处输入图片说明


18

无法加载资源,因为“应用程序传输安全性”策略要求使用在Swift 4.03中工作的安全连接。

打开您的pList.info作为源代码并粘贴:

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

13

从Apple文档

如果要开发新的应用程序,则应专门使用HTTPS。如果您已经有一个应用程序,则应立即使用HTTPS,并制定一个计划,以尽快迁移其余应用程序。此外,需要使用具有向前保密性的TLS 1.2版对通过更高级别的API进行的通信进行加密。如果尝试建立不符合此要求的连接,则会引发错误。如果您的应用需要向不安全的域发出请求,则必须在应用的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

这是Apple强制api上加强安全性的方法(被强制通过HTTP使用https)。我将说明如何删除此安全设置。


关于此的大多数答案指出将此密钥添加到您的info.plist 在此处输入图片说明

仅此一项并不能解决我这个问题。我必须在里面添加相同的密钥

Project -> Targets -> Info -> Custom iOS Target Properties 在此处输入图片说明


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

在此处输入图片说明


谢谢,这对我有用!我只编辑了plist文件,但没有用。我很惊讶其他人是如何做到这一点的
琼斯

8

您只需要在URL中使用HTTPS而不是HTTP,它将可以正常工作


3
当然,除非您不能使用HTTPS,否则是因为Apple不喜欢自签名证书。你没有那个问题吗?
托尼·B

1
就我而言,自从我改用HTTPS以来,它运行得非常完美
pierre23

1
但是您使用自签名证书还是CA签名证书?只是好奇。当然,这是一个单独的问题,但我想我会问。
托尼·B

我没有在服务器端工作,我不知道是老实的:(
Pierre23

在某些服务器环境(共享主机)上设置HTTPS连接可能很困难。
猛禽


5

iOS 9(可能)迫使开发人员专门使用App Transport Security。我在某个地方随机听到了这个消息,所以我自己也不知道这是不是真的。但我对此表示怀疑,并得出以下结论:

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

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

在应用程序的info.plist中,NSAppTransportSecurity [Dictionary]需要将NSAllowsArbitraryLoads [Boolean]其设置为密钥,YES否则Meteor需要很快使用httpslocalhost server


5

如果您使用的是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

在此处输入图片说明


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您的基本网址。谢谢。


3

对于那些在localhost上进行开发的人,请执行以下步骤:

  1. 点击旁边的“ +”按钮Information Property List并添加App Transport Security Settings并为其指定Dictionary类型
  2. 点击新创建的App Transport Security Settings条目旁边的“ +”按钮,然后添加NSExceptionAllowsInsecureHTTPLoads类型Boolean并将其值设置为YES
  3. 右键单击NSExceptionAllowsInsecureHTTPLoads条目,然后单击“右移行”选项,使其成为以上条目的子级。
  4. 点击NSExceptionAllowsInsecureHTTPLoads条目旁边的“ +”按钮并添加Allow Arbitrary Loads类型Boolean,并将其值设置为YES

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

在此处输入图片说明


2

我设法通过结合许多上述选项解决了这一问题。我将提供一份清单,其中列出了我要做的所有事情。

简而言之:

  1. NSAllowsArbitraryLoads我的手表扩展名(不是我的手表应用程序)设置为true。
  2. 确保我使用的https不是http

步骤1:

首先,最明显的是,我必须NSAppTransportSecurity在手表扩展名中添加一个键作为字典,info.plist并将一个称为NSAllowsArbitraryLoads布尔值的子键设置为true。在手表扩展程序中设置此项,而不在手表应用程序的plist中设置。尽管请注意,这允许所有连接,并且可能不安全。

在此处输入图片说明

要么

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

第二步:

然后,我必须确保要尝试加载的网址https不是,而不仅仅是http。对于仍然使用http的所有网址,我使用了:

斯威夫特

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

对象:

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


2

确保更改正确的info.plist文件

这是我第二次在此问题上浪费时间,因为我没有注意到我正在更改MyProjectNameUITests下的info.plist。


1

如果您使用Firebase,它将添加NSAllowsArbitraryLoadsInWebContent = true到该NSAppTransportSecurity部分中,NSAllowsArbitraryLoads = true将无法正常工作


感谢您提供此信息。您节省了我数小时的故障排除时间。
pAkY88

0

对于使用一年期签名证书而不是选项“ NSAllowsArbitraryLoads”的自托管解析服务器,我已经解决了此问题

将Parse Server解析为任何node.js服务器都会显示您必须指定的公共https URL。例如:

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

随意看一下我的配置文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.