// // 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