美文网首页IOS个人开发iOS学习
iOS开发之AFNetworking 3.0.4使用

iOS开发之AFNetworking 3.0.4使用

作者: Ke_Wang | 来源:发表于2016-01-28 12:01 被阅读72417次

博客迁移到简书一来,一直没有时间来写博客了,以前的也没有整理,这个算是简书上的第一个博客吧!以后有时间还是得把以前的迁移过来,毕竟都是心血啊,也有转载的很多大神们的技术文章,舍不得丢弃呀。。。

昨天使用Cocoapods导入AFN做POST的时候,导入的最新版的3.0.4,突然发现找不到AFHTTPRequestOperationManager了。。。上github上一看,发现没有这个了。刚开始以为是cocoapods没有给我导进去,因为是小demo,就想自己写一个网络请求的,发现也没有这NSURLConnection了,被弃用了,突然意识到,这个就是AFHTTPRequestOperationManager找不到的原因了,它是基于NSURLConnection封装的!!于是找了一下,现在都用的是NSURLSession了,AFN中用的是AFHTTPSessionManager了~~

特地记录下来,以便遇到这个的朋友们看看!

ps:如果想用以前的话,cocoapods 就不要用最新的版本了,2.6的上面有。


GET请求

<p> <code>

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 

[manager GET:URL parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {  

}     
 success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {  

 NSLog(@"这里打印请求成功要做的事");  

}

failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull   error) {  

NSLog(@"%@",error);  //这里打印错误信息

}];   

POST 请求

<p> <code>

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];


NSMutableDictionary *parameters = @{@"":@"",@"":@""};

[manager POST:URL parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
    
    
} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
    
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

}];

暂时用的比较多的就这两个,用到其他的 再来更新!!

最近又用到了下载,索性 上传下载都研究了一下 ,补充进来

补充试用AFN3.0下载方法

/**
 *  AFN3.0 下载
 */
- (void)downLoad{

    //1.创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //2.确定请求的URL地址
    NSURL *url = [NSURL URLWithString:@""];
    
    //3.创建请求对象
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    //下载任务
    NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
        //打印下下载进度
        WKNSLog(@"%lf",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
        
    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
        //下载地址
        WKNSLog(@"默认下载地址:%@",targetPath);
        
        //设置下载路径,通过沙盒获取缓存地址,最后返回NSURL对象
        NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
        return [NSURL fileURLWithPath:filePath];
        
        
    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
        
        //下载完成调用的方法
        WKNSLog(@"下载完成:");
        WKNSLog(@"%@--%@",response,filePath);
        
    }];
    
    //开始启动任务
    [task resume];

}

AFN3.0 上传

/**
 *  AFN 3.0 上传
 *      有两种方式
 *          upLoad1 和 upLoad2
 */

//第一种方法是通过工程中的文件进行上传
- (void)upLoad1{

    //1。创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //2.上传文件
    NSDictionary *dict = @{@"username":@"1234"};
    
    NSString *urlString = @"22222";
    [manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        //上传文件参数
        UIImage *iamge = [UIImage imageNamed:@"123.png"];
        NSData *data = UIImagePNGRepresentation(iamge);
        //这个就是参数
        [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"];
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //打印下上传进度
        WKNSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //请求成功
        WKNSLog(@"请求成功:%@",responseObject);
    
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        //请求失败
        WKNSLog(@"请求失败:%@",error);
    }];

}

//第二种是通过URL来获取路径,进入沙盒或者系统相册等等
- (void)upLoda2{
    //1.创建管理者对象
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    //2.上传文件
    NSDictionary *dict = @{@"username":@"1234"};
    
    NSString *urlString = @"22222";
    [manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" mimeType:@"application/octet-stream" error:nil];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        //打印下上传进度
        WKNSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //请求成功
        WKNSLog(@"请求成功:%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        //请求失败
        WKNSLog(@"请求失败:%@",error);
    }];
}

监测当前网络状态(网络监听)


- (void)AFNetworkStatus{

    //1.创建网络监测者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
    
    /*枚举里面四个状态  分别对应 未知 无网络 数据 WiFi
     typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
         AFNetworkReachabilityStatusUnknown          = -1,      未知
         AFNetworkReachabilityStatusNotReachable     = 0,       无网络
         AFNetworkReachabilityStatusReachableViaWWAN = 1,       蜂窝数据网络
         AFNetworkReachabilityStatusReachableViaWiFi = 2,       WiFi
     };
     */
    
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        //这里是监测到网络改变的block  可以写成switch方便
        //在里面可以随便写事件
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                WKNSLog(@"未知网络状态");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                WKNSLog(@"无网络");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWWAN:
                WKNSLog(@"蜂窝数据网");
                break;
                
            case AFNetworkReachabilityStatusReachableViaWiFi:
                WKNSLog(@"WiFi网络");
                
                break;
                
            default:
                break;
        }
        
    }] ;
}

有知道新版本用法的各位大神请不吝赐教,小白再次拜谢了!!

在使用的过程中遇到了一些问题的 总结,在这里,有需要的亲们可以去看一下,就不往这里放了,占地方。。。。

多谢各位道友的指正,在下载里面那个地方return [NSURL fileURLWithPath:filePath]; 已经改过来了

相关文章

网友评论

  • Afunnyrainman:返回的数据是U901a\U5dde\U533a\U89e3\U9664\U5927\U96fe\U6a59\U8272\U9884\U8b66
    各种方法都试过了,都不好使,请问楼主遇见过没
    Afunnyrainman:@WangK_Dev 我解决了,这个是unicode码,转换一下就好了。多谢
    Ke_Wang:@Afunnyrainman 这是Unicode 编码,打印用 printf 打印 ,我宏定义的打印,
    #define WKLog(format, ...) printf("\nclass: <%p %s:(%d) > \n method: %s \n%s\n", self, [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, __PRETTY_FUNCTION__, [[NSString stringWithFormat:(format), ##__VA_ARGS__] UTF8String] )
    你可以试试
  • 笨驴爱吃胡萝卜:get 和post 可以在一起写的NSURLSessionDataTask 用这个就可以了,现在都用session 这个还是进步了的,对于网络安全性有本质的提高,这也是之前为啥都爱用asi 的原因,不过现在afn 不停的更新以后会更好
  • 90后的晨仔:你好下载中多一个参数,该怎么写进去?
  • 43a28739aadd:"_OBJC_CLASS_$_AFHTTPSessionManager", referenced from:
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    get请求应该怎么解决
    求大神告知,我是菜鸟....
  • 吴德馨:简单精辟,不得不赞一下
  • Dove_iOS:--Boundary+F7F2AEAE1B150AFC\r\nContent-Disposition: form-data; name=\"ContactName\"\r\n\r\n1223\r\n--Boundary+F7F2AEAE1B150AFC\r\nContent-Disposition: form-data; name=\"GroupID\"\r\n\r\n1223\r\n--Boundary+F7F2AEAE1B150AFC\r\nContent-Disposition: form-data; name=\"Mail\"\r\n\r\n1223\r\n--Boundary+F7F2AEAE1B150AFC\r\nContent-Disposition: form-data; name=\"Mobile\"\r\n\r\n1223\r\n--Boundary+F7F2AEAE1B150AFC--\r\n"
    后台接收到的数据是这个样子,我同时传的图片和字典,不知道为什么会这样.
    Dove_iOS:@WK_IOSDevelpoer 对,上传图片.同时带了字典,方法是这个[manager POST:url parameters:parameters constructingBodyWithBlock:......
    Ke_Wang:@Dove_iOS 上传图片么?
    Ke_Wang:@Dove_iOS 你是做什么需求的 ?
  • a1634a52a033:简单明了
  • ce8593ab41e8:太感谢了,上传成功
  • 普罗格兰姆:nice,刚好解决了需求,后台的自定义file字段搞的很尴尬
  • 4陈雨泽4:你也是够了
  • 阿伟的代码世界:监测网络状态少一行代码。[manager startMonitoring];
    这行代码是打开检测并且开始检测网络状态的意思。
    Ke_Wang:@阿伟什么的 应该是封装时候调用了:joy::joy::joy:
    阿伟的代码世界:@WK_IOSDevelpoer 这我就不知道了,但是我感觉肯定有开始检查的机制。你在程序里面搜索一下startMonitoring,看看是不是在其他地方调用了。 如果没有的话,你重新创建一个工程,单独导入afnetworking试一下。
    Ke_Wang:@阿伟什么的 :flushed: 我现在项目就是这样 没有那句,但是也能正常监测网络状态啊。。。什么情况。。。
  • 西叶lv:上传时,mimeType参数该怎么写??我见有的人传图片,把mimeType写了“application/x-www-form-urlencoded”,“application/x-www-form-urlencoded”也是图片格式的标志?
    Ke_Wang:@郝嘉律 application/x-www-form-urlencoded 这个确实不知道。。。你要上传图片的时候就写@"image/png" 或者@"image/jpeg" 就行,我就这么写的。。。。
    西叶lv:@WK_IOSDevelpoer 好的,三克油,我查了下,那个是媒体资源类型,不同的文件有不同规定的资源类型标志,但是application/x-www-form-urlencoded不知道是表示什么类型的文件啊
    Ke_Wang:@郝嘉律 稍等一下下,我整理下上传头像的东西贴出来你看下:joy: :joy:
  • c6b04035c7d8:post请求,如果客户端传入的数据是一个数据流,后台用WebUtil.getRequest().getInputStream();接收时,发现只能接收到请求,却接受不到数据,我想应该是AFNetworking 3.0里面限制了,是这样的么?如果不是AFNetworking 3.0限制的话,客户端怎么传入这个数据流呢?
  • 奔跑吧小二:你好,请问一个问题。
    如果一个任务在下载过程中被取消了,删除了这个下载任务,那~/tmp/目录下对应的文件如何删除呢 ?
    奔跑吧小二:@WK_IOSDevelpoer 下载结束前,应该是拿不到tmp目录下对应的文件名字,系统后台生成的,只有结束的时候可以
    Ke_Wang:@奔跑吧小二 清理下沙盒下那个文件不行么?:fearful:
  • 会飞的鲱鱼:@WK_IOSDevelpoer 请问图片上传中 name:@"file" ,这个name 是固定的吗 为“file”吗? 如果不固定,那是怎么传参数的!能给一个后台和我前端的使用例子吗??谢谢了!
    会飞的鲱鱼:@WK_IOSDevelpoer 解决了 用了原生 后台没有给我参数 于是就直接把图片流传给后台了 谢谢
    Ke_Wang:@会飞的鲱鱼 name用了@“”,是文件的名称啊,比如说是上传个123.png,这name就是123 ,参数这个你得跟后台商量的,怎么简单怎么来 。。。。
  • 牛牛大王奥利给:网络监听差一句。。 [manager startMonitoring]; //开始检测 不写方法不会走的。。
    牛牛大王奥利给:@WK_IOSDevelpoer :同行,不客气:stuck_out_tongue_closed_eyes:
    Ke_Wang:@luckyBears 多谢指正,可能漏了:joy::joy:
  • b232749c73dc:网络请求post请求请求不了报错:-[AFHTTPSessionManager POST:parameters:progress:success:failure:]: unrecognized selector sent to instance 0x1701de5a0 怎么回事?网上也搜不到答案,快哭了。我是菜鸟
    Ke_Wang:@非洲胚胎 应该是参数传错了,用json传
  • UILabelkell:多任务下载 这个怎么搞????
  • macfai:是啊,楼主,麻烦把多张上传的也写进去吧,多谢:smile:
  • 90cbb258620a:上传多张图片 怎么搞?求告知
    我家有头大懒猪:表单提交有多少张图片frameData就appendPartWithFileData:data几次
    Ke_Wang:@YJL_iOS :joy::joy:我就干过一个的。。。明天帮你查查啊
  • 巴图鲁:膜拜
  • Damon_Rao:我想用post 请求 把数据放在body里面,parameters不放东西要怎么实现啊大神
    Ke_Wang:@Damon_Rao 那个好像得用其他的方法,我没搞过 :joy:
  • 土豆的疑问:请问 AFN 请求头怎样通过字典设置?
    Ke_Wang:@土豆的疑问 :joy: 我一直都是写参数的,,,没搞过那个
  • Ke_Wang:不好意思啊,这个我暂时也没有研究啊 :joy: :joy:
  • 南方小金豆:楼主想请教下afn3.0上https的配置问题?
    升级iOS10后,去掉了ATS强制转换,总是报错
    Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, NSUnderlyingError=0x17044bfa0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。总是报这个错误
  • HansYe:很感谢您的分享,对我的帮助很大,谢谢了
    我在使用你写的 :
    监测当前网络状态(网络监听)
    那段代码时发现他不能监听网络的变化,请问是要设置什么吗?还是有其他问题?
    望回复。
    Ke_Wang:@HansYe 不能监听吗?我明天上班了看一下啊,这会没带电脑,你可以先看下API里面怎么写的
  • macfai:请问下你的这个上传下载的方法是不是都是亲测可用的啊?如果是的话,我记直接用了啊,谢谢
    macfai:@WK_IOSDevelpoer 好的
    Ke_Wang:@macfai 你可以再测一下啊 我试的时候比较早,版本是0.4 的那个 现在好像1.0都有了
  • d4d5907268a9:AF 3.0 上传和下载的 progress block 都不会回调,不知道博主遇到这个问题了吗
    Ke_Wang:@初_心 接口可用 但是进度不行么? 那打印下 进度的block,看看情况
    d4d5907268a9:@WK_IOSDevelpoer 不是的 真的就是不调,接口可以的 就是无法知道进度
    Ke_Wang:@初_心 你可以看下是不是你那边接口的问题呀。。。。 :joy:
  • cf883209d2a4:想问下你 Get请求中 parameters 是把参数放在这里面吗?
    Ke_Wang:对呀,parameter就是参数的意思
  • xfs_coder:找了半天啊,终于找到你了
    Ke_Wang:@做一个优秀的程序猿 :joy::joy:
  • 缺舟:求教:我使用 [manager POST:url parameters:parameters constructingBodyWithBlock:这个方法进行请求的时候,参数传不过去,
    缺舟: NSString *loginName = [MSEncryptUtil encryptUseDES:_userName.text key:@"04200106"];
    NSString *password = [MSEncryptUtil encryptUseDES:_userPass.text key:@"04200106"];
    NSString *strUrl = [NSString stringWithFormat:@"%@user/login",RSE_URL];
    NSMutableDictionary *loginDic = [NSMutableDictionary dictionaryWithCapacity:0];
    [loginDic setValue:loginName forKey:@"loginName"];
    [loginDic setValue:password forKey:@"password"];

    // 开启网络指示器
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 设置超时时间
    [manager.requestSerializer willChangeValueForKey:@"timeoutInterval"];
    manager.requestSerializer.timeoutInterval = 20.f;
    [manager.requestSerializer didChangeValueForKey:@"timeoutInterval"];
    // 请求参数类型
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/xml",@"text/html", nil ];
    // post请求
    [manager POST:strUrl parameters:loginDic constructingBodyWithBlock:
    缺舟: @WK_IOSDevelpoer 我就是用的字典啊
    Ke_Wang:@缺舟 参数用字典写啊
  • 归虹尘:这个真的很全.
  • c丶大圣:无敌 棒棒哒
  • 辣炒年糕:上传录音的时候那个mimetype设置成什么
  • 白鹿Divella:NSURL *url = [NSURL URLWithString:BaseURL];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    httpClient.parameterEncoding = AFFormURLParameterEncoding;
    请问这3句怎么用AFN3.0里面的方法写呀,还有AFHTTPClient到底被那个类代替了?非常感谢
  • 159c294e6098:一个坑,下载里面
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
    return [NSURL URLWithString:filePath];
    本地路径的URL不是用这个方法,这样写根本下不到磁盘。
    return [NSURL fileURLWithPath:filePath];
    Ke_Wang:@159c294e6098 :joy::joy::joy::joy:马上改!!
  • Xcode8:感谢大神的分享
  • a81a7396fec2:很不错的,顶一个,af的3.0之后和之前的差别很大,终于找到了可以参考的了
  • 凯文Kevin21:写的很好。现在支持IPV6,好像要用这个才行。
  • 流光还铅华:我用你的代码例子上传图片,为什么总是报400错误?另外问一下有没有什么好的,测试文件上传接口的方法?
  • b62464f52c9d:下载代码中,应该是[NSURL fileURLWithPath:],而不是[NSURL URLWithString:filePath];
  • e16fb2d7b631:post请求中的progress里面处理什么数据?
    e16fb2d7b631:@WK_IOSDevelpoer 😂😂😂😂 谢啦
    Ke_Wang:@互撸娃二世 这个好像是请求时候进度控制的,一般情况下写nil就行。。。我也没有精研过😂😂😂😂
  • afd47268d3d0: 提示一下,监听网络要加一句 [manager startMonitoring];
  • 追沐:大赞,简介明了,代码风格很喜欢。
  • d9a604e139aa:很明了 但是 有几个参数 在上传里面 的name、fileName、mineType这几个参数穿什么 没搞懂(原谅我英语不好),还有上传的时候 不需要和后台有相对应的字段吗
  • 子不语冰:3.0的下载怎么实现杀死进程从新进入程序的断点续传,这个问题弄了好长时间了
    子不语冰:@Hoolink 没有 我下载使用了TCBlobDownload 这个可以解决这个问题
    一抹相思泪成雨:@子不语冰 你解决了没有?
  • 253271352e3e:return [NSURL URLWithString:filePath];
    貌似应该改成 return [NSURL fileURLWithPath:filePath];
    73757dc22d2e:多谢,换成[NSURL fileURLWithPath:filePath]才找到文件,用[NSURL URLWithString:filePath]一直找不到下载的文件! :pray: :pray: :pray:
    253271352e3e:@kr山人 :sob: 我试的时候不行 搞了半天才找到这个原因
    my__life:@火焰鼠 以前试过,貌似都可以
  • 可爱的活火山:请问为什么我参数明明有值的,post之后服务器得到的是空的呢
    墨雨萧生:我也遇到了post为空的问题,楼主是不是写错了,左边是request,右边是response
    X先生_vip:@b78b0d472682 @胡祥清
    //默认是AFHTTPRequestSerializer
    self.requestSerializer = [AFJSONResponseSerializer serializer];//声明请求参数是json格式
    这样试试
  • c7cdfe70671d:请问AfNetWorking3.0.4怎么同时发多个请求?
  • 丶丶夏天:新手小白想问下,使用AFN需要导入哪些文件
    Ke_Wang:@2f0e9d948df7 GitHub上下载的,里面有个AFN那个文件夹就行,pod的话直接导入头文件就行了
  • bb3475ebe622:谢谢分享
  • 搬砖快乐:很华丽!
  • 幻凌风:今天上传图片失败,阁下文章简单明了,帮我解决了使用中的困扰!非常感谢!
    Ke_Wang:@幻凌风 不客气,都遇到过坑,能解决就好
  • JuncyChen:真是感谢了,终于找到完整的用法,解决了问题
    Ke_Wang:@大侠来一个 不客气,一起学习,这个现在用的人还不多,所以资料比较少啊
  • 朋友有朋:简单明了!!
  • Ke_Wang:以前版本是也有这个的,不过都没用。。。
    b96896a97e03:作者您好,请教一个问题,如果是需要NSURLCredential验证的请求该如何实现呢?

本文标题:iOS开发之AFNetworking 3.0.4使用

本文链接:https://www.haomeiwen.com/subject/qqcjkttx.html