一、介绍
在项目开发中,服务端和客户端的协作尤为重要,而连接它们的最重要的环节之一就是网络请求,对于服务端而言,如果这个环节出现了错误,那么安全性就无从谈起,同时对于客户端而言,如果这个模块出现了错误,那么后续的开发就无法继续进行下去。诚然,当网络请求真的出现了问题,快速定位问题的源头就显得迫在眉睫了。本博文提供三种定位问题源头的方法,判断是服务端的原因,还是客户端的原因,避免大家找问题浪费大量的无用功。
二、ATS
一个配置网络请求方式的配置字段,NSAppTranportSecurity下的 Allow Arbitrary Loads,设置为NO,默认所有的网络请求都必须走HTTPS(SSL/TLS)协议;如果设置为YES,即是全局设置,既可以走HTTP协议,也可以走HTPPS(SSL/TLS)协议。
三、问题定位方式(查看网络请求的详细log日志)
第一种方式:配置CFNETWORK_DIAGNOSTICS=1
步骤:打开xcode的项目,找到edit scheme中的run,然后选择Arguments,给Envaironment Variables添加CFNETWORK_DIAGNOSTICS=1,最后运行程序发送网络请求即可。此时在consolelog控制器会给出网络请求详细的log日志文件路径,根据路径找到就OK了。配置如图:
点击按钮测试发送请求,我以我公司的官方来测试(本公司服务端已做了https配置)
// ViewController.m // RequestDemo // Created by 夏远全 on 16/12/25. // Copyright © 2016年 广州市东德网络科技有限公司. All rights reserved. #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; //发送请求 UIButton *requestBtn = [[UIButton alloc] initWithFrame:CGRectMake(140, 200, 200, 80)]; requestBtn.backgroundColor = [UIColor redColor]; [requestBtn setTitle:@"requestSend" forState:UIControlStateNormal]; [requestBtn setTitleColor:[UIColor greenColor] forState:UIControlStateNormal]; [requestBtn addTarget:self action:@selector(requestSend) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:requestBtn]; } //发送请求 -(void)requestSend{ NSURL *URL = [NSURL URLWithString:@"https://www.biaojiepay.com"]; NSURLRequest *request = [NSURLRequest requestWithURL:URL]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSLog(@"complete"); }]; } @end
打印的显示log日志文件路径如下:
2016-12-26 00:29:26.910 RequestDemo[966:51790] CFNetwork diagnostics log file created at: /Users/FanLei/Library/Developer/CoreSimulator/Devices/C4192179-66A1-40C6-B09B-095C1248F68E/data/Containers/Data/Application/FE58F06E-B7BC-428E-82AE-0ED0A567ACD1/Library/Logs/CrashReporter/CFNetwork_com.biaojiepay.RequestDemo_966.nwlrb.log 2016-12-26 00:29:27.049 RequestDemo[966:50107] complete
此时按照提供的路径去访问该文件查看,里面记录了网络请求的详细日志信息
第二种方式:采用mac自带的命令行查看网络请求日志,即/usr/bin/nscurl --ats-diagnostics --verbosehttps://www.biaojiepay.com(这个是带上的测试网址)
使用该命令行发送请求测试,我以我公司的官方来测试(本公司服务端已做了https配置,所有验证都会通过Pass)
终端运行结果如下:可以看到全都支持,所以pass通过
第三种方式:如果是服务端的问题,可以采用TLSTool来帮助你定位。(坑:TSLTool不能再Xcode8下编译)
先下载工具编译后,再在终端测试示例:我以我公司的官方来测试,端口443(本公司服务端已做了https配置,所有验证都会通过Pass)
./TLSTool s_client -connect www.biaojiepay.com:443 GET https://www.biaojiepay.com HTTP/1.1 Host: www.biajiepay.com