- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题遍布 Stack Overflow,过去 2 天我一直在尝试无数种 ATP 配置组合,并让我的应用程序正常工作。我将彻底解决我的问题,因为看起来最微小的事情都会影响如何解决这个问题。
我最近刚刚设置了一个启用了 SSL 和 TLS 1.2 的 Ubuntu 14 服务器。在我的服务器上是我的应用程序所依赖的服务器端脚本。在我的应用程序中,我使用 NSMutableURLRequest 从服务器请求我的 API,如下所示:
NSString * noteDataString = [NSString stringWithFormat:@"email=%@&password=%@&type=%@", companyEmail, companyPassword, @"login"];
NSData * postData = [noteDataString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString * postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest * request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"https://mydomain.me:443/path/to/file.php"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSHTTPURLResponse * urlResponse = nil;
NSError * error = nil;
NSData * responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];
NSString * result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
NSLog(@"Response Code: %ld", (long)[urlResponse statusCode]);
当我将 url 复制到 Chrome 时,会显示正确的 PHP 返回值。当从 iOS 9 上的 Xcode 7 请求时,我收到此错误:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
我在类似问题中使用了无数的 info.plist 设置。我试过禁用前向保密的需要,我试过启用任意负载,我试过使用异常域 mydomain.me 及其子域。我取得的唯一进展是将错误代码 -9813 切换为 -9802。
我知道为 NSURLRequest 添加委托(delegate)方法,但这些方法从未被调用,并且被认为对于解决此问题是多余的。
我使用 localhost 和 http 在 MAMP 服务器上构建了很多应用程序,当我启用任意加载时请求有效,所以我的 plist 没有问题。
令人难以置信的是为什么我有一个特殊情况,我知道 Stack Overflow 是处理这种情况的地方!
谢谢,我希望这在解决后能帮助我以外的更多开发人员。
最佳答案
解决方案。感谢评论中的每个人为我指明了正确的方向。解决方案是创建一个 NSObject 来处理这种特殊情况的 NSURLRequests。
归功于:https://www.cocoanetics.com/2010/12/nsurlconnection-with-self-signed-certificates/
以下几乎是链接中教程的直接副本,但我认为留在此处会更容易。
所以,
我必须使用以下代码创建一个新的 NSObject 类:
BWWebService.h
#import <Foundation/Foundation.h>
@interface BWWebService : NSObject{
NSMutableData *receivedData;
NSURLConnection *connection;
NSStringEncoding encoding;
}
- (id)initWithURL:(NSURL *)url;
@end
BWWebService.m
#import "BWWebService.h"
@implementation BWWebService
- (id)initWithURL:(NSURL *)url{
if (self = [super init]){
NSURLRequest * request = [NSURLRequest requestWithURL:url];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];
}
return self;
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
// Every response could mean a redirect
receivedData = nil;
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)
[response textEncodingName]);
encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
if (!receivedData){
// No store yet, make one
receivedData = [[NSMutableData alloc] initWithData:data];
}else{
// Append to previous chunks
[receivedData appendData:data];
}
}
// All worked
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
NSString * xml = [[NSString alloc] initWithData:receivedData encoding:encoding];
NSLog(@"%@", xml);
}
// And error occurred
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
NSLog(@"Error retrieving data, %@", [error localizedDescription]);
}
// To deal with self-signed certificates
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace{
return [protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
// we only trust our own domain
if ([challenge.protectionSpace.host isEqualToString:@"myuntrusteddomain.me"]){
NSURLCredential * credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
}
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
@end
如果这还不够,为了发出请求,我使用以下内容替换我的原始请求:
NSURL * url = [NSURL URLWithString:@"https://myuntrusteddomain.me:443/path/to/script.php"];
BWWebService * webService;
webService = [[BWWebService alloc] initWithURL:url];
我知道这不像原来的那样发布数据,但那是后来的。我确信这将是处理 initWithURL 中的 POST 的问题。
谢谢大家
编辑:该解决方案的应用似乎只适用于将“允许任意加载”设置为"is"的情况。
关于iOS 9 ATS 使用自签名证书阻止对服务器的 HTTPS 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35207139/
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 Stack Overflow 的 on-topic。 4年前关闭。
假设我有一个列表 xs。如何在 ATS 中编写以下循环样式: foreach x in xs do process(x) 最佳答案 您可以使用旧的 DIY 风格(也:经典的 ATS 风格),也就是说,
在开头加上:从 ATS 网站学习 ATS。 尝试从列表中提取记录时,一旦我尝试引用记录变量,就会在下面的 x4.a 上收到类型错误。 那么为什么会失败 - x4 不知道它有记录吗? typedef a
我知道可以使用 libc/math 中的 sqrt 函数来完成它: staload Math = "libats/libc/SATS/math.sats" val sqrt2 = $Math.sqrt
我可以像堆栈一样使用列表,但是在 ATS 中创建队列的正确方法是什么?例如,假设我有以下伪代码: val xs = queue_create() val () = xs.enqueue(1) val
例如,如何在 ATS 中构造一个数组,其中包含从 A 到 Z 的所有大写字母?在 C 中,这可以按如下方式完成: char *Letters() { int i; char *cs = (
例如,我正在 ATS 中寻找一个示例,该示例或多或少地执行以下 C 代码的功能: int *theMultable[10][10]; void theMultable_initialize() {
例如,如何构造一个包含所有数字的列表:0、1、2、3、4、5、6、7、8 和 9。 最佳答案 您可以使用 val xs = ($list {int} (0, 1, 2, 3, 4, 5, 6, 7,
基本上,我正在寻找或多或少相当于以下 C 代码的东西: int theGlobalCount = 0; int theGlobalCount_get() { return theGlobalCount
假设我想对列表中的整数求和。我可以通过在列表上应用初始值为 0 的 reduce 运算符和加法函数来做到这一点。 ATS中reduce算子叫什么名字? 最佳答案 “reduce”这个名字有点含糊。它可
这里有两段代码我认为是等效的,除了第二段的行数比它应该多: fun move_ul {i:nat} ( p: int(i) , ms: list0(Int) ): list0(Int) = if
我经常在 ATS 中看到使用 case、case+ 或 case- 形成的 case 表达式。有什么区别? 最佳答案 如果表达式不详尽,使用 case 会发出警告,case+ 会产生错误,而 case
我知道如何使用 patsopt 和 atscc2js 将 ATS 代码编译成 JS 代码: patsopt -d foo.dats | atscc2js -o foo_dats.js 我是否需要为 a
例如,如何在 ATS 中编写 x 的 10 次幂的表达式?我尝试了 x^10 和 x^^10,但都没有奏效。 最佳答案 ATS 中整数和浮点值的取幂运算符是 ** ,如 implement main0
当使用像 list_map 这样的高阶函数时,需要构建闭包函数并将它们作为参数传递。之后,构建的闭包就变成了垃圾。有没有办法在调用堆栈上构建这样的闭包函数(以便在调用后自动释放它们)? 最佳答案 正如
main0 函数的类型是什么? 我正在编写 gtk3 库。但是 g_application_run() 函数需要 argv。当然,ATS语言可以在main0函数上使用argv。但是类型是什么? 最佳答
有时,我会看到如下代码: var foo = lam@(x: int): int => ... lam@ 是什么意思? lam 和 lam@ 有什么区别? 最佳答案 在内存方面,lam 创建一个盒装闭
这是日期格式化程序设置: let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium dateFormatter.tim
我想得到下面的结果但不使用 at语法,因为它在 Safari 中不受支持,我很难使用它。有谁知道任何方法?先感谢您! #content { background-color: black; h
也许我可以使用这样的脚本文件: 现在在 -f script_file 但是如何将参数分配给脚本。 最佳答案 at 没有 -f 开关。你可以像下面这样使用它: echo "sh script.sh" |
我是一名优秀的程序员,十分优秀!