前言:

由于苹果声明在前说是2017.01.01之后提交审核的APP,必须使用HTTPS请求,要不就直接驳回审核,吓得我们年前赶紧提交了一个版本,想着年后在弄这个https,结果又有消息说是苹果推迟了这个要求,大家还可以继续使用http,至于时间好像是还没有公布,不过人家既然都这么说了,看来早晚还是要用https的,就趁着刚开年不是太忙,就把这个给配置一下。首先我要说下这个配置我是弄了一天的,至于为什么弄了这么久,是因为我和后台说好的用正式服测,结果给了我一个测试服的证书,害的我弄了快一天了才忽然发现原来域名不对,重新让后台做了个证书给我,就立马好了。

这是我从开始着手弄到请求正常遇到的不懂的点,因为一开始完全是懵逼的状态

  • https比http牛逼、更安全,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。
  • 前端如何和后端“沟通”呢?1、公司有钱的直接买个证书,前段把证书导入到项目加一段代码就OK了(是不是想骂人),因为我在查资料时一般都是说的很简单,结果自己还是不懂。一会后面说怎么加代码。2、公司没钱或不想掏钱的就让服务器人员自己建一个(有的公司有运维的是运维建),至于怎么建咱们就不管了。
  • 其他一些问题我也忘了,不过下面我一步一步的讲解吧。

    我不配图片了。

配置开始

无论AF是2.0还是3.0的都需要完成前面步骤:

1.给后台人员或运维人员沟通,向他们所要一个.cer的证书文件,至于网上还有什么其他的CA文件、其他格式文件的,不用管,先保存到桌面。

2.回到桌面,双击此.cer文件(如果没有感觉就多双击几次也没有关系),然后打开钥匙串访问,找到你刚才添加的证书(有可能是域名、有可能是名称,实在找不到就在钥匙串访问界面右上角点击搜索,一般好像是域名的,如:139.196.什么什么的),找到后右键,导出此证书(格式也是.cer的)到桌面,现在桌面上有两个。cer格式的证书,为了不弄混淆,你可以把第一个(也就是你双击的那个蓝色的)删掉到垃圾桶里。

3。把桌面上仅有的一个.cer格式的证书,直接拖到你的工程里,位置自己随意,

4.开始工程里的操作,plist里的Allow Arbitrary Loads 改为 YES(这个不多说,不懂的网上一大堆),然后你的URL前缀要换成https://的,其他不用改。

5.开始分2.0和3.0的了,不管你封装不封装你的AF,反正需要的也就一段代码,同样也不区分GET和POST的,我以不封装的POST举例,各位看官各取所需吧:

AFNetworking 2.0

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//此处召唤https
manager.securityPolicy = [self customSecurityPolicy];
//urlString 是你的请求的URL(记得是https://开头的哦)
//param 是一个NSDictionary 是你的请求带的参数
[manager POST:urlString parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject){
NSLog(@"https请求成功");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"https请求失败,原因:%@",error);
}];
/***这是抽出来的方法,复制需看清***/
/**
* SSL校验
*/
- (AFSecurityPolicy *)customSecurityPolicy
{
//导入证书后,找到证书的路径 ()
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"这是你证书的名字(不是域名)" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath]; //AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES; //validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO; securityPolicy.pinnedCertificates = @[certData]; return securityPolicy; }

OK,如果按照步骤应该是已经能调通了的。加入报code = 1202 或 说证书无效,域名无效或危险的,或说将要前往隐藏域名什么什么的,这些是证书不正确(意思就是证书上的域名和你请求的域名不一致,需要按证书的域名来)

AFNetworking 3.0

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//此处召唤https
manager.securityPolicy = [self customSecurityPolicy];
//strUrl 是你的请求的URL(记得是https://开头的哦)
//dic 是一个NSDictionary 是你的请求带的参数
[manager POST:strUrl parameters:dic progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"进度");
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"成功");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"失败:%@",error);
}];
/***这是抽出来的方法,复制需看清***/
/**
* SSL校验
*/
- (AFSecurityPolicy *)customSecurityPolicy
{
//先导入证书,找到证书的路径
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"这是你证书的名字(不是域名)" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath]; //AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES; //validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO; NSSet *set = [[NSSet alloc] initWithObjects:certData, nil]; securityPolicy.pinnedCertificates = set; return securityPolicy; }

OK,如果按照步骤应该是已经能调通了的。加入报code = 1202 或 说证书无效,域名无效或危险的,或说将要前往隐藏域名什么什么的,这些是证书不正确(意思就是证书上的域名和你请求的域名不一致,需要按证书的域名来)

至此, 已经完成了以AFNetworking为基础的HTTPS的配置,配置好后,其实还是很容易的,只不过网上的说法或教程留的隐藏的坑太多,更多心得前往博主首页,感谢AF的网络框架,感谢看到这篇心得的朋友,希望能帮到你们。感谢所有。(纯手打)如有不明白的可以问我

AFNetworking2.0和AFNetworking3.0 的HTTPS的配置的更多相关文章

  1. iOS 适配https(AFNetworking3.0为例)

    众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https楼主正好近日将http转为https,给还没动手的朋友分享一二 1.准备证书 首先找后台要一个证书(SSL证书,一般你跟后台说 ...

  2. iOS开发--基于AFNetWorking3.0的图片缓存分析

    图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作.[TOC] 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.C ...

  3. iOS- 利用AFNetworking3.0+(最新AFN) - 实现文件断点下载

    官方建议AFN的使用方法   0.导入框架准备工作 •1. 将AFNetworking3.0+框架程序拖拽进项目   •2. 或使用Cocopod 导入AFNetworking3.0+   •3.   ...

  4. AFNetworking3.0+MBProgressHUD二次封装,一句话搞定网络提示

    对AFNetworking3.0+MBProgressHUD的二次封装,使用更方便,适用性非常强: 一句话搞定网络提示: 再也不用担心网络库更新后,工程要修改很多地方了!网络库更新了只需要更新这个封装 ...

  5. 基于AFNetworking3.0网络封装

    概述 对于开发人员来说,学习网络层知识是必备的,任何一款App的开发,都需要到网络请求接口.很多朋友都还在使用原生的NSURLConnection一行一行地写,代码到处是,这样维护起来更困难了. 对于 ...

  6. iOS_SN_基于AFNetworking3.0网络封装

    转发文章,原地址:http://www.henishuo.com/base-on-afnetworking3-0-wrapper/?utm_source=tuicool&utm_medium= ...

  7. 【转载】基于AFNetWorking3.0的图片缓存分析

    原文出处: Yasin的简书 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.CoreData…).我们常说的网络请求缓存包 ...

  8. IOS 网络浅析-(十一 三方 AFNetworking3.0简介)

    AFNetworking3.0是目前最新的版本,本来打算介绍一下2.6,但是想想2.6名不久矣,就决定不介绍了,有兴趣的小伙伴可以上网查一查.下面我就开始进入正题了. 目前使用人数最多的第三方网络库, ...

  9. 网络婚礼之AFNetWorking3.0

    目前使用人数最多的第三方网络库,没有之一.从开始的NSURLConnection到现在的NSURLSession,它都一直保持着与苹果的步调一致,而由它也衍生出大量的相关第三方网络功能库,不仅仅因为他 ...

随机推荐

  1. iOS开发——发短信,邮件

    在IOS开发中,有时候我们会需要用到邮件发送的功能.比如,接收用户反馈和程序崩溃通知等等,这个功能是很常用的.在苹果系统中,如果彼此的手机都是iOS设备,并且开通了iMessage功能,那么彼此之间的 ...

  2. mybatis--常见的错误

    1.没有在configuration.xml配置对应的sql配置文件 错误: Error updating database. Cause: java.lang.IllegalArgumentExce ...

  3. jquery为某div下的所有textbox的赋值

    html代码 <input type="button" value="变量div_Alltext中的变量" onclick="Do_DivAll ...

  4. js-权威指南学习笔记8

    第8章 函数 1.参数有形参和实参的区别,形参相当于函数中定义的变量,实参是在运行时的函数调用时传入的参数. 2.函数表达式可以包含名称,这在递归时很有用. 3.函数定义表达式特别适合用来定义那些只会 ...

  5. javascript--study

    1.函数传参:按值传递 对于数字.字符串等是将它们的值传递给了函数参数,函数参数的改变不会影响函数外部的变量. 对于数组和对象等是将对象(数组)的变量的值传递给了函数参数,这个变量保存的指向对象(数组 ...

  6. IOS开发中数据持久化的几种方法--NSUserDefaults

    IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...

  7. 2)Java学习笔记:匿名内部类

    为什么要使用匿名内部类 ①如果以前的类有一些缺陷,只是想在某一个模块进行修复,可以在引用该类的地方使用匿名内部类,在overRide方法进行修复. ②如果一个类,需要派生出很多类,而且这些类大多只是在 ...

  8. c# post 数据的方法

    网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以用来提取网页HTML的组件比较多,常用的用WebBrowser.WebClient.HttpWebRequest这三 ...

  9. 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...

  10. 【转】sql语句的优化分析

    开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...