无法加载资源,因为App Transport Security策略要求使用安全连接

时间:2015-09-17 13:11:52

标签: ios nsurlconnection nsurlsession ios9 xcode7

当我将Xcode更新为7.0或iOS 9.0时,我遇到了问题。 不知怎的,它开始给我标题错误

  

“无法加载资源,因为App Transport Security   政策要求使用安全连接“

Webservice方法:

-(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“   无法加载资源,因为App Transport Security策略   需要使用安全连接。“   UserInfo = {NSUnderlyingError = 0x7fada0f31880 {错误   Domain = kCFErrorDomainCFNetwork Code = -1022“(null)”},   NSErrorFailingURLStringKey = MyServiceURL 下,   NSErrorFailingURLKey = MyServiceURL 下,   NSLocalizedDescription =无法加载资源,因为   应用程序传输安全策略要求使用安全   连接。}

我尝试过以下问题和答案,但没有得到任何结果,是否有任何提前想法如何删除该服务调用错误?

  1. The resource could not be loaded is ios9
  2. App Transport Security Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

22 个答案:

答案 0 :(得分:850)

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

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

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

  3. 添加了一个名为NSAllowsArbitraryLoads的子项Boolean,并将其值设置为YES,如下图所示。
  4. enter image description here

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

    参考链接: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>
    

答案 1 :(得分:240)

请注意,在项目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>

清洁&amp;编辑后构建项目。

答案 2 :(得分:37)

传输安全性在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

答案 3 :(得分:31)

对于iOS 10.x和Swift 3.x [也支持以下版本]只需在'info.plist'中添加以下行

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

答案 4 :(得分:22)

在Swift 4中你可以使用

- &gt; Go Info.plist

- &GT;单击信息属性列表的加号

- &gt;将应用传输安全设置添加为字典

- &GT;单击加号图标应用传输安全设置

- &GT;添加允许任意载入设置

贝娄图像看起来像

enter image description here

答案 5 :(得分:21)

我已解决为plist文件。

添加NSAppTransportSecurity:Dictionary。

添加名为&#34的子项; NSAllowsArbitraryLoads&#34; as Boolean:是

enter image description here

答案 6 :(得分:13)

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

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

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

答案 7 :(得分:10)

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

enter image description here

答案 8 :(得分:9)

您只需在网址中使用HTTPS而不是HTTP,它就可以使用

答案 9 :(得分:9)

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

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

答案 10 :(得分:9)

在Xcode 7.1之后(swift 2.0)

enter image description here

答案 11 :(得分:7)

如果您不是XML的忠实粉丝,那么只需在plist文件中添加以下标记即可。

enter image description here

答案 12 :(得分:5)

iOS 9(可能)强制开发者专门使用 App Transport Security 。我无意中听到了这个地方,所以我不知道这是否属实。但我怀疑它并得出了这个结论:

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

这意味着运行meteor run ios或meteor run ios-device将(可能?)不再有效。

在应用的info.plist中,NSAppTransportSecurity [Dictionary]需要将密钥NSAllowsArbitraryLoads [Boolean]设置为YES,否则Meteor需要将https用于其localhost server很快。

答案 13 :(得分:4)

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

  

在我的情况下,需要将网址 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

答案 14 :(得分: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。感谢。

答案 15 :(得分:2)

我设法通过结合许多提到的选项来解决这个问题。我将列出一份清单,说明我必须做的所有事情才能使其发挥作用。

简而言之:

  1. 为我的观看分机(不是我的观看应用)设置NSAllowsArbitraryLoads为真。
  2. 确保我使用的是https而不是http
  3. 第一步:

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

    enter image description here

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

    第二步:

    然后我必须确保我尝试加载的网址是https,而不只是http。对于任何仍然使用http的网址:

    <强>夫特

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

    <强>的OBJ-C:

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

答案 16 :(得分:2)

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

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

答案 17 :(得分:1)

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

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

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

enter image description here

答案 18 :(得分:1)

这是在您的api上强制采用更严格安全性的苹果方式(被强制通过HTTP使用https)。我将说明如何删除此安全设置。


关于此的大多数答案指出将此密钥添加到您的info.plist enter image description here

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

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


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

enter image description here

答案 19 :(得分:0)

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

解析服务器,因为任何node.js服务器都会提供您必须指定的公共https网址。例如:

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

随意查看我的configuration files

答案 20 :(得分:0)

如果您使用firebase,它将在NSAllowsArbitraryLoadsInWebContent = true部分中添加NSAppTransportSecurity,而NSAllowsArbitraryLoads = true将不起作用

答案 21 :(得分:0)

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

enter image description here

这是 info.plist 源代码的样子

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