iOS 开发之网络编程(二)


第三方网络框架
  • AFNetworking

一款轻量级网络请求开源框架,基于iOSmac OS 网络进行扩展的高性能框架,大大降低了iOS开发工程师处理网络请求的难度,让iOS开发变成一件愉快的事情。

  • AFNetworking优点

1.原有基础urlsesson上封装了一层,在传参方面更灵活,
2.回调更友好,
3.支持返回数据序列化
4.支持文件上传,断点下载,
5.自带多线程,防死锁
6.处理了Https证书流程,节省移动端开发
7.支持网络状态判断

AFN.jpeg
  • AFNetWorking发送POST&GET请求:
#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@property (strong, nonatomic)AFHTTPSessionManager *manager;

@end

@implementation ViewController

- (AFHTTPSessionManager *)manager{
    
    if (!_manager) {
        _manager = [AFHTTPSessionManager manager];
    }
    
    return _manager;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
//    [self getData];
    
    
    [self postData];
    
}

- (void)postData{
    
    NSString *path = @"http://120.25.226.186:32812/login";
    NSDictionary *parames=@{
                            @"username":@"520it",
                            @"pwd":@"520it",
                            @"type":@"JSON"
                            };
    [self.manager POST:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success:----%@-%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"failuer:----%@",error);
    }];
    
}

- (void)getData{
    
//    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    /**
     * 参数说明
     *
     * 第一个参数:请求的路径(NSString)不包含参数
     * 第二个参数:需要传入的参数
     * 第三个参数:附加到此请求的默认头的头
     * 第四个参数:请求数据的进度
     * 第五个参数:请求成功后的回调
     *           task:可以拿到响应头信息
                 responseObject:响应体信息 AFN内部默认对服务器返回数据进行json解析
     *
     * 第六个参数:请求失败后的回调
     *
     */
    NSString *path = @"http://120.25.226.186:32812/login";
    NSDictionary *parames=@{
                            @"username":@"520it",
                            @"pwd":@"520it",
                            @"type":@"JSON"
                            };
    [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success:----%@-%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"failuer:----%@",error);
        
    }];
    
}
@end

-AFNetWorking文件下载&上传

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@property (strong, nonatomic)AFHTTPSessionManager *manager;

@end

@implementation ViewController

- (AFHTTPSessionManager *)manager{
    
    if (!_manager) {
        
        _manager = [AFHTTPSessionManager manager];
        
    }
    
    return _manager;
    
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
//    [self downLoad];
    
    [self upLoad];
    
}

//上传
- (void)upLoad{
    
    NSString *urlPath = @"http://120.25.226.186:32812/upload";
    NSDictionary *params = @{
                            @"username":@"aaaaa"
                            };
    /**
     * 参数说明
     *
     * 第一个参数:请求路径
     * 第二个参数:非文件参数:oc的字典(NSDictionary)
     * 第三个参数:constructingBodyWithBlock 处理要上传的文件参数的
     * 第四个参数:progress进度的回调
     * 第五个参数:success上传成功的回调
     *           task
     *           responseObject响应体信息(内部已经完成了JSON解析)
     * 第六个参数:failure上传失败的回调
     *
     */
    
    [self.manager POST:urlPath parameters:params headers:nil constructingBodyWithBlock:^(id  _Nonnull formData) {
        //id协议:遵守这个协议就可以该协议中的方法
        
        //处理要上传的文件

        NSString *path = @"/Users/nana/Desktop/timg.jpeg";
        NSURL *url = [NSURL fileURLWithPath:path];
    
        //第一种方法
        
        /**
         * 参数说明
         *
         * 第一个参数:FileData:要上传文件的二进制数据
         * 第二个参数:name:具体的数值 file
         * 第三个参数:fileName:文件的名称
         * 第四个参数:mimeType:文件的二进制数据类型
         *
         */
        
//        NSData *imageData = [NSData dataWithContentsOfFile:path];
//        [formData appendPartWithFileData:imageData name:@"file" fileName:url.lastPathComponent mimeType:@"image/jpeg"];
        
        //第二种方法
        
        /**
         * 参数说明
         *
         * 第一个参数:FileURL:本地文件的URL路径
         * 第二个参数:name:具体的数值 file
         * 第三个参数:mimeType:文件的二进制数据类型
         *
         */
//        [formData appendPartWithFileURL:url name:@"file" fileName:url.lastPathComponent mimeType:@"image/jpeg" error:nil];
        
        //第三种方法
        
        /**
         * 参数说明
         *
         * 第一个参数:FileURL:本地文件的URL路径
         * 第二个参数:name:具体的数值 file
         *
         */
        [formData appendPartWithFileURL:url name:@"file" error:nil];
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //计算进度信息
    NSLog(@"进度信息:%f",1.0*uploadProgress.completedUnitCount/uploadProgress.totalUnitCount);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success:%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"failure:%@",error);
        
    }];
    
    
}


//下载
- (void)downLoad{
    
     NSURL *url = [NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1591442074704&di=760001ecc8d2d0df7d98a8d6cc083bce&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F68%2F61%2F300000839764127060614318218_950.jpg"];

     NSURLRequest *request = [NSURLRequest requestWithURL:url];

    /**
     * 参数说明
     *
     * 第一个参数:Request:请求对象
     * 第二个参数:progress:进度回调
     * 第三个参数:destination回调:需要在该回调中告诉方法应该把下载的文件保存到哪里
     *           targetPath:默认返回的临时存储路径(tmp)
     *           response:响应头信息
     *           返回值:文件应该的存储路径
     * 第四个参数:completionHandler:完成后的回调
     *
     */
     NSURLSessionDownloadTask *downLoadTask = [self.manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {

        NSLog(@"下载进度:%f",1.0*downloadProgress.completedUnitCount/downloadProgress.totalUnitCount);
        
     }destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        //拼接文件的存储路径给AFN,内部会自动的完成文件的剪切处理
        NSLog(@"targetPath: %@",targetPath);

        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        
        NSString *fileName = response.suggestedFilename;
        
        NSString *fullPath = [cachesPath stringByAppendingPathComponent:fileName];
        
        NSLog(@"fullPath:%@",fullPath);
        
        return [NSURL fileURLWithPath:fullPath];
        
     }completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

        //filePath:文件的路径(即上面回调的返回值)
        NSLog(@"filePath:%@",filePath);
        
     }];

     [downLoadTask resume];
}
@end
  • AFNetworkingJson&Xml解析

manager = [AFHTTPSessionManager manager];

manager:内部默认已经对服务器返回的数据进行了JSON解析操作AFJSONResponseSerializer

manager:如果返回的数据是XML类型:需要调整manager对响应的解析方式:AFXMLParserResponseSerializer
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];

manager:如果返回的数据类型既不是json也不是xml
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@property (strong, nonatomic)AFHTTPSessionManager *manager;
/**
 * <#注释#>
 */
@property (strong, nonatomic)NSMutableArray *dataArray;
@end

@implementation ViewController

- (NSMutableArray *)dataArray{
    
    if (!_dataArray) {
        _dataArray = [NSMutableArray array];
    }
    
    return _dataArray;
}


- (AFHTTPSessionManager *)manager{
    
    if (!_manager) {
        
        _manager = [AFHTTPSessionManager manager];
   
      //_manager:内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
  //_manager:如果返回的数据是XML类型:需要调整manager对响应的解析方式:AFXMLParserResponseSerializer
        
        //        _manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
        
        //_manager:如果返回的数据类型既不是json也不是xml

        _manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    }
    
    return _manager;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
//    [self getJson];
    
//    [self getXML];
    
//    [self httpData];
    
}

- (void)httpData{
    
    NSString *path = @"http://www.baidu.com";
    NSDictionary *parames=nil;
    
    [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success:----%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"failuer:----%@",error);
        
    }];
    
}

- (void)getXML{
    
    NSString *path = @"http://120.25.226.186:32812/video";
    
    NSDictionary *parames=@{
                            @"type":@"XML"
                            };
    
    [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success:----%@-%@",[responseObject class],responseObject);
        
        //使用NSXMLParser解析数据
        
        //01 创建解析器
        NSXMLParser *parser = (NSXMLParser *)responseObject;
        
        //02 设置代理
        parser.delegate = self;
        //03 开始解析
        [parser parse];
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"failuer:----%@",error);
        
    }];
    
}

- (void)getJson{
    
    
    NSString *path = @"http://120.25.226.186:32812/video";
    NSDictionary *parames=@{
                            @"type":@"JSON"
                            };
    
    //内部默认已经对服务器返回的数据进行了JSON解析操作 AFJSONResponseSerializer
    [self.manager GET:path parameters:parames headers:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"success:----%@-%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"failuer:----%@",error);
        
    }];
    
}

#pragma---------------------------------------
#pragma MARK - NSXMLParserDelegate

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    
    NSLog(@"%@ - \n -%@",elementName,attributeDict);
    
    [self.dataArray addObject:attributeDict];
    
}

@end
  • AFNetworking 网络状态监听
- (void)netStateType{
    
    //01 创建网络监听管理者对象
    AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager manager];
    //02 监听
    [netManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        
        //当监听网络装调改变的时候,就会调用block,并且把当前的网络状态作为参数传递给block
        /**
         typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
             AFNetworkReachabilityStatusUnknown          = -1,
             AFNetworkReachabilityStatusNotReachable     = 0,
             AFNetworkReachabilityStatusReachableViaWWAN = 1,
             AFNetworkReachabilityStatusReachableViaWiFi = 2,
         };
         */
        switch (status) {
                
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知的网络状态");
                break;
                
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"没有网络");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窝网络");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"WiFi网络");
                break;
                
            default:
                break;
        }
    }];
    
    //03 开始监听
    [netManager startMonitoring];
    
}

你可能感兴趣的:(iOS 开发之网络编程(二))