当我将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 =无法加载资源,因为 应用程序传输安全策略要求使用安全 连接。}
我尝试过以下问题和答案,但没有得到任何结果,是否有任何提前想法如何删除该服务调用错误?
答案 0 :(得分:850)
我已经通过在info.plist中添加一些密钥解决了这个问题。 我遵循的步骤是:
打开我的项目目标的info.plist
文件
添加了一个名为NSAppTransportSecurity
的密钥作为Dictionary
。
NSAllowsArbitraryLoads
的子项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>
答案 1 :(得分:240)
请注意,在项目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>
清洁&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>
答案 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;添加允许任意载入设置是
贝娄图像看起来像
答案 5 :(得分:21)
我已解决为plist文件。
添加NSAppTransportSecurity:Dictionary。
添加名为&#34的子项; NSAllowsArbitraryLoads&#34; as Boolean:是
答案 6 :(得分:13)
无法加载资源,因为App Transport Security策略要求使用在Swift 4.03中运行的安全连接。
打开您的pList.info作为源代码并粘贴:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
答案 7 :(得分:10)
答案 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)
答案 11 :(得分:7)
答案 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
答案 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)
我设法通过结合许多提到的选项来解决这个问题。我将列出一份清单,说明我必须做的所有事情才能使其发挥作用。
简而言之:
NSAllowsArbitraryLoads
为真。https
而不是http
。第一步:
首先,最明显的是我必须在我的监视扩展程序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")
<强>的OBJ-C:强>
NSString *newURLString = [oldURLString stringByReplacingOccurrencesOfString:@“http” withString:@“https”];
答案 16 :(得分:2)
确保更改正确的info.plist文件。
这是 第二次 我在这个问题上浪费时间,因为我没有注意到我在MyProjectNameUITests下更改了info.plist。
答案 17 :(得分:1)
对于那些在localhost上开发的人,请执行以下步骤:
Information Property List
旁边的“ +”按钮,然后添加App Transport Security Settings
并为其指定一个Dictionary
类型App Transport Security Settings
条目旁边的“ +”按钮,然后添加类型为NSExceptionAllowsInsecureHTTPLoads
的{{1}}并将其值设置为Boolean
。 YES
条目,然后单击“右移行”选项,使其成为上述条目的子级。 NSExceptionAllowsInsecureHTTPLoads
条目旁边的“ +”按钮,然后添加类型为NSExceptionAllowsInsecureHTTPLoads
的{{1}}并将其值设置为Allow Arbitrary Loads
注意:最终看起来应该如下图所示
答案 18 :(得分:1)
这是在您的api上强制采用更严格安全性的苹果方式(被强制通过HTTP使用https)。我将说明如何删除此安全设置。
关于此的大多数答案指出将此密钥添加到您的info.plist
仅此一项并不能为我解决这个问题。 我必须在里面添加相同的键
Project -> Targets -> Info -> Custom iOS Target Properties
这将允许任何人进行不安全的连接。如果只想允许特定的域使用不安全的连接,则可以将以下内容添加到info.plist中。
答案 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)