zoukankan      html  css  js  c++  java
  • iOS中AFNetworking2.0和AFNetworking3.0 的HTTPS的配置

    前言:

    由于苹果声明在前说是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的网络框架,感谢看到这篇心得的朋友,希望能帮到你们。感谢所有。(纯手打)如有不明白的可以问我

  • 相关阅读:
    前端开发常用工具
    Promise和setTimeout执行顺序
    化生汤
    与vue+element相对于的组合
    脾胃笔记
    中医脉象
    javacript 面向对象
    fabric 安装及使用
    jquery.tablesorter.js 学习笔记
    iframe 标签自适应高度和宽度
  • 原文地址:https://www.cnblogs.com/zhangsheng-iOS/p/6398920.html
Copyright © 2011-2022 走看看