资源无法加载,因为应用传输安全策略需要使用安全连接
当我将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安全策略需要使用安全连接。}
我试过以下的问题和答案,但没有得到任何结果,有没有任何先进的想法,我可以删除该服务电话错误?
- 无法加载的资源是ios9
- 应用程序传输安全性Xcode 7 beta 6
- https://stackoverflow.com/a/32609970
我已经通过在info.plist中添加一些键来解决这个问题。 我遵循的步骤是:
-
打开我的Projects
info.plist
文件 -
添加了一个名为
NSAppTransportSecurity
的密钥作为Dictionary
。 - 添加一个名为
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>
我已经解决了作为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,它就可以工作
我设法解决这个与许多提到的选项的组合。 我将包括我必须做的所有事情的清单,以使其工作。
简而言之:
- 设置
NSAllowsArbitraryLoads
为我的手表扩展(不是我的手表应用程序)。 - 确保我使用的是
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
。 谢谢。