New file |
| | |
| | | // |
| | | // NetworkDemo.m |
| | | // PPNetworkHelper |
| | | // |
| | | // Created by AndyPang on 16/8/12. |
| | | // Copyright © 2016年 AndyPang. All rights reserved. |
| | | // |
| | | |
| | | /* |
| | | ********************************************************************************* |
| | | * |
| | | *⭐️⭐️⭐️ 新建 PP-iOS学习交流群: 323408051 欢迎加入!!! ⭐️⭐️⭐️ |
| | | * |
| | | * 如果您在使用 PPNetworkHelper 的过程中出现bug或有更好的建议,还请及时以下列方式联系我,我会及 |
| | | * 时修复bug,解决问题. |
| | | * |
| | | * Weibo : jkpang-庞 |
| | | * Email : jkpang@outlook.com |
| | | * QQ 群 : 323408051 |
| | | * GitHub: https://github.com/jkpang |
| | | * |
| | | * PS:我的另外两个很好用的封装,欢迎使用! |
| | | * 1.一行代码获取通讯录联系人,并进行A~Z精准排序(已处理姓名所有字符的排序问题): |
| | | * GitHub:https://github.com/jkpang/PPGetAddressBook |
| | | * 2.iOS中一款高度可定制性商品计数按钮(京东/淘宝/饿了么/美团外卖/百度外卖样式): |
| | | * GitHub:https://github.com/jkpang/PPNumberButton |
| | | * |
| | | * 如果 PPGetAddressBookSwift 好用,希望您能Star支持,你的 ⭐️ 是我持续更新的动力! |
| | | ********************************************************************************* |
| | | */ |
| | | |
| | | #import "NetworkDemo.h" |
| | | #import "PPNetworkHelper.h" |
| | | #import "PPHTTPRequest.h" |
| | | #import "AFNetworking.h" |
| | | #import "BaseResModel.h" |
| | | #import "Global.h" |
| | | |
| | | #ifdef DEBUG |
| | | #define PPLog(...) printf("[%s] %s [第%d行]: %s\n", __TIME__ ,__PRETTY_FUNCTION__ ,__LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]) |
| | | #else |
| | | #define PPLog(...) |
| | | #endif |
| | | |
| | | |
| | | static NSString *const dataUrl = @"http://api.budejie.com/api/api_open.php"; |
| | | static NSString *const downloadUrl = @"http://wvideo.spriteapp.cn/video/2016/0328/56f8ec01d9bfe_wpd.mp4"; |
| | | |
| | | @interface NetworkDemo () |
| | | |
| | | @property (weak, nonatomic) IBOutlet UITextView *networkData; |
| | | @property (weak, nonatomic) IBOutlet UITextView *cacheData; |
| | | @property (weak, nonatomic) IBOutlet UILabel *cacheStatus; |
| | | @property (weak, nonatomic) IBOutlet UISwitch *cacheSwitch; |
| | | @property (weak, nonatomic) IBOutlet UIProgressView *progress; |
| | | @property (weak, nonatomic) IBOutlet UIButton *downloadBtn; |
| | | |
| | | /** 是否开启缓存*/ |
| | | @property (nonatomic, assign, getter=isCache) BOOL cache; |
| | | |
| | | /** 是否开始下载*/ |
| | | @property (nonatomic, assign, getter=isDownload) BOOL download; |
| | | @end |
| | | |
| | | @implementation NetworkDemo |
| | | |
| | | - (void)viewDidLoad { |
| | | [super viewDidLoad]; |
| | | |
| | | /** |
| | | 设置网络请求参数的格式:默认为二进制格式 |
| | | PPRequestSerializerJSON(JSON格式), |
| | | PPRequestSerializerHTTP(二进制格式) |
| | | |
| | | 设置方式 : [PPNetworkHelper setRequestSerializer:PPRequestSerializerHTTP]; |
| | | */ |
| | | |
| | | /** |
| | | 设置服务器响应数据格式:默认为JSON格式 |
| | | PPResponseSerializerJSON(JSON格式), |
| | | PPResponseSerializerHTTP(二进制格式) |
| | | |
| | | 设置方式 : [PPNetworkHelper setResponseSerializer:PPResponseSerializerJSON]; |
| | | */ |
| | | |
| | | /** |
| | | 设置请求头 : [PPNetworkHelper setValue:@"value" forHTTPHeaderField:@"header"]; |
| | | */ |
| | | |
| | | // 开启日志打印 |
| | | [PPNetworkHelper openLog]; |
| | | |
| | | [PPNetworkHelper setRequestSerializer:PPRequestSerializerJSON]; |
| | | |
| | | // 获取网络缓存大小 |
| | | PPLog(@"网络缓存大小cache = %fKB",[PPNetworkCache getAllHttpCacheSize]/1024.f); |
| | | |
| | | // 清理缓存 [PPNetworkCache removeAllHttpCache]; |
| | | |
| | | // 实时监测网络状态 |
| | | [self monitorNetworkStatus]; |
| | | |
| | | /* |
| | | * 一次性获取当前网络状态 |
| | | 这里延时0.1s再执行是因为程序刚刚启动,可能相关的网络服务还没有初始化完成(也有可能是AFN的BUG), |
| | | 导致此demo检测的网络状态不正确,这仅仅只是为了演示demo的功能性, 在实际使用中可直接使用一次性网络判断,不用延时 |
| | | */ |
| | | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ |
| | | [self getCurrentNetworkStatus]; |
| | | }); |
| | | |
| | | [self data_upload]; |
| | | } |
| | | |
| | | /** |
| | | |
| | | 通过封装好的网络层进行请求配 , 我目前的项目是这样做的,在工程中的 PPHTTPRequestLayer 文件夹可以看到 |
| | | 当然,不同的项目可以有不同的做法,没有最好的做法,只有最合适的做法, |
| | | 这仅仅是我抛砖引玉, 希望大家能各显神通. |
| | | */ |
| | | - (void)PPHTTPRequestLayerDemo |
| | | { |
| | | // // 登陆 |
| | | // [PPHTTPRequest getLoginWithParameters:@"参数" success:^(id response) { |
| | | // |
| | | // } failure:^(NSError *error) { |
| | | // |
| | | // }]; |
| | | // |
| | | // // 退出 |
| | | // [PPHTTPRequest getExitWithParameters:@"参数" success:^(id response) { |
| | | // |
| | | // } failure:^(NSError *error) { |
| | | // |
| | | // }]; |
| | | } |
| | | |
| | | |
| | | -(void)data_upload |
| | | { |
| | | |
| | | // UploadModel *model = [[UploadModel alloc] init]; |
| | | // |
| | | // |
| | | // model.lat = [NSString stringWithFormat:@"%lf",0.00000]; |
| | | // model.lon = [NSString stringWithFormat:@"%lf",0.00000]; |
| | | // model.userid = @"597bf6a1a0e6d23f5c3c9869"; |
| | | // model.address = @"测试地址"; |
| | | // |
| | | // NSMutableArray * dataModelArr = [[NSMutableArray alloc] init]; |
| | | // for (int i = 0; i < 10; i++) { |
| | | // DataModel * model = [[DataModel alloc] init]; |
| | | // model.time = @"2018-04-23 10:09:28"; |
| | | // model.type = @"1"; |
| | | // model.is_warn = @"0"; |
| | | // model.value = @"0.012"; |
| | | // [dataModelArr addObject:model]; |
| | | // } |
| | | // |
| | | // model.data = [[NSMutableArray alloc] init]; |
| | | // [model.data addObjectsFromArray:dataModelArr]; |
| | | NSMutableDictionary *param = [[NSMutableDictionary alloc] init]; |
| | | [param setObject:@"15162662339" forKey:@"username"]; |
| | | [param setObject:@"123456" forKey:@"password"]; |
| | | |
| | | // // 登陆 |
| | | // [PPHTTPRequest getLoginWithParameters:param success:^(id responseBody) { |
| | | // BaseResModel * resModel = [Global toBaseModel:responseBody]; |
| | | // if(resModel.code == 1) |
| | | // { |
| | | // |
| | | // } |
| | | // } failure:^(NSError *error) { |
| | | // PPLog(@"网络错误%@",error); |
| | | // }]; |
| | | |
| | | //[UserDefault stringForKey:@"user_id"] |
| | | // NSString *path = [[NSString alloc] initWithFormat:DATA_UPLOAD]; |
| | | // |
| | | // UploadModel *model = [[UploadModel alloc] init]; |
| | | // |
| | | // //['refresh_frequency', 'video', 'is_open_upload'] |
| | | // //[param setValue:[UserDefault stringForKey:@"user_id"] forKey:@"user_id"]; |
| | | // address = @"测试地址"; |
| | | // |
| | | // model.lat = [NSString stringWithFormat:@"%lf",latitude]; |
| | | // model.lon = [NSString stringWithFormat:@"%lf",longitude]; |
| | | // model.userid = [UserDefault stringForKey:@"user_id"]; |
| | | // model.address = address; |
| | | // |
| | | // model.data = [[NSMutableArray alloc] init]; |
| | | // [model.data addObjectsFromArray:dataModelArr]; |
| | | // |
| | | // //NSString * tempString = [Global convertToJsonData:model.toDic]; |
| | | // MPWeakSelf(self); |
| | | // [NetworkSingleton networkingPostMethod:model.toDic urlName:path success:^(id responseBody) |
| | | // { |
| | | // MPStrongSelf(self); |
| | | // BaseResModel * resModel = [Global toBaseModel:responseBody]; |
| | | // |
| | | // if(resModel.code == 1) |
| | | // { |
| | | // [dataModelArr removeAllObjects]; |
| | | // |
| | | // //[UserDefault setObject:self.is_open_upload forKey:@"is_open_upload"]; |
| | | // [UserDefault synchronize]; |
| | | // |
| | | // //[self.tableView reloadData]; |
| | | // [Global alertMessageEx:resModel.desc title:@"提示信息" okTtitle:nil cancelTitle:@"OK" delegate:self]; |
| | | // } |
| | | // else |
| | | // { |
| | | // [Global alertMessageEx:resModel.desc title:@"提示信息" okTtitle:nil cancelTitle:@"OK" delegate:self]; |
| | | // } |
| | | // } |
| | | // failure:^(NSString *error) |
| | | // { |
| | | // |
| | | // [Global alertMessageEx:error title:@"提示信息" okTtitle:nil cancelTitle:@"OK" delegate:self]; |
| | | // }]; |
| | | } |
| | | |
| | | #pragma mark - 获取数据请求示例 GET请求自动缓存与无缓存 |
| | | #pragma mark - 这里的请求只是一个演示, 在真实的项目中建议不要这样做, 具体做法可以参照PPHTTPRequestLayer文件夹的例子 |
| | | - (void)getData:(BOOL)isOn url:(NSString *)url |
| | | { |
| | | |
| | | [self data_upload]; |
| | | |
| | | NSDictionary *para = @{ @"a":@"list", @"c":@"data",@"client":@"iphone",@"page":@"0",@"per":@"10", @"type":@"29"}; |
| | | // 自动缓存 |
| | | if(isOn) |
| | | { |
| | | self.cacheStatus.text = @"缓存打开"; |
| | | self.cacheSwitch.on = YES; |
| | | [PPNetworkHelper GET:url parameters:para responseCache:^(id responseCache) { |
| | | // 1.先加载缓存数据 |
| | | self.cacheData.text = [self jsonToString:responseCache]; |
| | | } success:^(id responseObject) { |
| | | // 2.再请求网络数据 |
| | | self.networkData.text = [self jsonToString:responseObject]; |
| | | } failure:^(NSError *error) { |
| | | |
| | | }]; |
| | | |
| | | } |
| | | // 无缓存 |
| | | else |
| | | { |
| | | self.cacheStatus.text = @"缓存关闭"; |
| | | self.cacheSwitch.on = NO; |
| | | self.cacheData.text = @""; |
| | | |
| | | [PPNetworkHelper GET:url parameters:para success:^(id responseObject) { |
| | | self.networkData.text = [self jsonToString:responseObject]; |
| | | } failure:^(NSError *error) { |
| | | |
| | | }]; |
| | | |
| | | } |
| | | |
| | | } |
| | | #pragma mark - 实时监测网络状态 |
| | | - (void)monitorNetworkStatus |
| | | { |
| | | // 网络状态改变一次, networkStatusWithBlock就会响应一次 |
| | | [PPNetworkHelper networkStatusWithBlock:^(PPNetworkStatusType networkStatus) { |
| | | |
| | | switch (networkStatus) { |
| | | // 未知网络 |
| | | case PPNetworkStatusUnknown: |
| | | // 无网络 |
| | | case PPNetworkStatusNotReachable: |
| | | self.networkData.text = @"没有网络"; |
| | | [self getData:YES url:dataUrl]; |
| | | PPLog(@"无网络,加载缓存数据"); |
| | | break; |
| | | // 手机网络 |
| | | case PPNetworkStatusReachableViaWWAN: |
| | | // 无线网络 |
| | | case PPNetworkStatusReachableViaWiFi: |
| | | [self getData:[[NSUserDefaults standardUserDefaults] boolForKey:@"isOn"] url:dataUrl]; |
| | | PPLog(@"有网络,请求网络数据"); |
| | | break; |
| | | } |
| | | |
| | | }]; |
| | | |
| | | } |
| | | |
| | | #pragma mark - 一次性获取当前最新网络状态 |
| | | - (void)getCurrentNetworkStatus |
| | | { |
| | | if (kIsNetwork) { |
| | | PPLog(@"有网络"); |
| | | if (kIsWWANNetwork) { |
| | | PPLog(@"手机网络"); |
| | | }else if (kIsWiFiNetwork){ |
| | | PPLog(@"WiFi网络"); |
| | | } |
| | | } else { |
| | | PPLog(@"无网络"); |
| | | } |
| | | // 或 |
| | | // if ([PPNetworkHelper isNetwork]) { |
| | | // PPLog(@"有网络"); |
| | | // if ([PPNetworkHelper isWWANNetwork]) { |
| | | // PPLog(@"手机网络"); |
| | | // }else if ([PPNetworkHelper isWiFiNetwork]){ |
| | | // PPLog(@"WiFi网络"); |
| | | // } |
| | | // } else { |
| | | // PPLog(@"无网络"); |
| | | // } |
| | | } |
| | | |
| | | #pragma mark - 下载 |
| | | |
| | | - (IBAction)download:(UIButton *)sender { |
| | | |
| | | static NSURLSessionTask *task = nil; |
| | | //开始下载 |
| | | if(!self.isDownload) |
| | | { |
| | | self.download = YES; |
| | | [self.downloadBtn setTitle:@"取消下载" forState:UIControlStateNormal]; |
| | | |
| | | task = [PPNetworkHelper downloadWithURL:downloadUrl fileDir:@"Download" progress:^(NSProgress *progress) { |
| | | |
| | | CGFloat stauts = 100.f * progress.completedUnitCount/progress.totalUnitCount; |
| | | self.progress.progress = stauts/100.f; |
| | | |
| | | PPLog(@"下载进度 :%.2f%%,,%@",stauts,[NSThread currentThread]); |
| | | } success:^(NSString *filePath) { |
| | | |
| | | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"下载完成!" |
| | | message:[NSString stringWithFormat:@"文件路径:%@",filePath] |
| | | delegate:nil |
| | | cancelButtonTitle:@"确定" |
| | | otherButtonTitles:nil]; |
| | | [alertView show]; |
| | | [self.downloadBtn setTitle:@"重新下载" forState:UIControlStateNormal]; |
| | | PPLog(@"filePath = %@",filePath); |
| | | |
| | | } failure:^(NSError *error) { |
| | | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"下载失败" |
| | | message:[NSString stringWithFormat:@"%@",error] |
| | | delegate:nil |
| | | cancelButtonTitle:@"确定" |
| | | otherButtonTitles:nil]; |
| | | [alertView show]; |
| | | PPLog(@"error = %@",error); |
| | | }]; |
| | | |
| | | } |
| | | //暂停下载 |
| | | else |
| | | { |
| | | self.download = NO; |
| | | [task suspend]; |
| | | self.progress.progress = 0; |
| | | [self.downloadBtn setTitle:@"开始下载" forState:UIControlStateNormal]; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | #pragma mark - 缓存开关 |
| | | - (IBAction)isCache:(UISwitch *)sender { |
| | | [[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:@"isOn"]; |
| | | |
| | | [self getData:sender.isOn url:dataUrl]; |
| | | } |
| | | |
| | | /** |
| | | * json转字符串 |
| | | */ |
| | | - (NSString *)jsonToString:(NSDictionary *)dic |
| | | { |
| | | if(!dic){ |
| | | return nil; |
| | | } |
| | | NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil]; |
| | | return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; |
| | | } |
| | | |
| | | - (void)didReceiveMemoryWarning { |
| | | [super didReceiveMemoryWarning]; |
| | | // Dispose of any resources that can be recreated. |
| | | } |
| | | @end |