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

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

“由于App Transport安全策略要求使用安全连接,因此无法加载资源”

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服务方法。 我得到的logging错误是:

连接失败:错误域= NSURLErrorDomain代码= -1022“资源无法加载,因为应用程序传输安全策略要求使用安全连接。 UserInfo = {NSUnderlyingError = 0x7fada0f31880 {Error Domain = kCFErrorDomainCFNetwork Code = -1022“(null)”},NSErrorFailingURLStringKey = MyServiceURL ,NSErrorFailingURLKey = MyServiceURL ,NSLocalizedDescription =资源无法加载,因为App Transport安全策略需要使用安全连接。}

我试过以下的问题和答案,但没有得到任何结果,有没有任何先进的想法,我可以删除该服务电话错误?

  1. 无法加载的资源是ios9
  2. 应用程序传输安全性Xcode 7 beta 6
  3. https://stackoverflow.com/a/32609970

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

  1. 打开我的Projects info.plist文件

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

  3. 添加一个名为NSAllowsArbitraryLoads的子项,并将其值设置为YES ,如下图所示。

在这里输入图像说明

清理项目,现在一切都运行良好,像以前一样。

Ref链接: 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允许与任何服务器的连接都是不安全的。 如果你想确保只有一个特定的域可以通过一个不安全的连接访问,试试这个:

在这里输入图像说明

或者,作为源代码:

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

编辑完成后清理并build立项目。

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

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

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

所以在默认情况下,只有https应用程序只允许https调用 要closuresApp 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

我已经解决了作为plist文件。

添加一个NSAppTransportSecurity:Dictionary。

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

在这里输入图像说明

在Xcode 7.1以上(swift 2.0)

在这里输入图像说明

从苹果文档

如果您正在开发新的应用程序,则应该专门使用HTTPS。 如果您有现有的应用程序,则应尽可能使用HTTPS,并尽快制定一个计划来迁移应用程序的其余部分。 此外,通过更高级别的API进行的通信需要使用TLS 1.2版进行encryption,并具有正向保密性。 如果您尝试build立不符合此要求的连接,则会引发错误。 如果您的应用需要向不安全域发出请求,则必须在应用的Info.plist文件中指定此域。

绕过App Transport安全性:

 <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中configurationApp Transport安全例外

如果您使用Xcode 8.0和Swift 3.0或2.2

在这里输入图像说明

iOS 9(可能)强制开发者专门使用App Transport Security 。 我偶然听到这个,所以我不知道这是否是真实的我自己。 但我怀疑它,并得出这个结论:

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

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

在应用程序的info.plist中, NSAppTransportSecurity [Dictionary]需要将NSAllowsArbitraryLoads [Boolean]的关键字设置为YES否则Meteor需要尽快使用https作为其localhost server

你只需要在你的URL中使用HTTPS而不是HTTP,它就可以工作

我设法解决这个与许多提到的选项的组合。 我将包括我必须做的所有事情的清单,以使其工作。

简而言之:

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

步骤1:

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

在这里输入图像说明

要么

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

第二步:

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

Swift

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

OBJ-C:

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

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

将服务器parsing为任何node.js服务器都会显示您必须指定的公共httpsurl 。 例如:

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

随意看看我的configuration文件

如果你不是XML的粉丝,那么只需在你的plist文件中添加下面的标签即可。

在这里输入图像说明

如果你使用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 

在这里输入图像说明

打开你的pList.info作为源代码,并在底部之前添加以下代码,

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

最后,用您的基本url更改your.domain.com 。 谢谢。