关于AFNetworking的使用

本文为自己在学习AFNetworking的使用过程中碰到的一些问题,总结成文。

在运行疯狂iOS讲义中关于AFNetworking库的应用时碰到了以下问题。

打开示例代码发现AFURLConnectionOperation.m文件中提示有个_cancelled属性未定义,于是在该文件中添加一句  “@synthesize cancelled = _cancelled;”(注意@synthesize语句需要添加在实现部分——“@implementation”),问题解决。

@implementation AFURLConnectionOperation
@synthesize outputStream = _outputStream;
@synthesize cancelled = _cancelled;
...

调试AFNetworking应用时,控制台报如下错误:

App Transport Security has blocked acleartext HTTP (http://) resource load since it is insecure. Temporaryexceptions can be configured via your app's Info.plist file.

首先说明一下自己的开发环境(XCode7.3,模拟器采用的 iPhone6s),出现上述错误的原因在于:iOS9.0 由于强制使用https,所以默认不能使用http建立连接。

有两种解决办法:

第一种:使用https协议来连接。

第二种:修改info.plist文件,步骤如下

1.  Info.plist中添加NSAppTransportSecurity类型Dictionary

2.  NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES

具体请参考 https://segmentfault.com/a/1190000002933776


在文件上传的示例中,点击上传后控制台报告如下错误信息
*** Terminating app due touncaught exception 'NSInvalidArgumentException', reason: '*** -streamStatusonly defined for abstract class.  Define-[AFMultipartBodyStream streamStatus]!'

网络上找到的解决方法:将AFNetWorking更新到最新版本(示例程序中采用的是2.5的版本),但是新版本(3.x)的AFNetworking文件夹中没有AFHTTPRequestOperationManager.hAFHTTPRequestOperationManager.m文件,因此替换为新版本的AFNetworking文件夹会提示找不到AFHTTPRequestOperationManager.h文件。另外,在将AFNetworking文件夹拖入XCode时,选择“Create groups”(如果选择“Create folder references”,编译时也会提示“找不到AFHTTPRequestOperationManager.h文件”)

关于2.x到3.x的迁移,请参考以下链接中的Migration章节:

https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-3.0-Migration-Guide

AFNetworking Version

Minimum iOS Target

Minimum OS X Target

Notes

3.x

iOS 7

OS X 10.9

Xcode 7+ is required. NSURLConnectionOperation support has been removed.

2.6 -> 2.6.3

iOS 7

OS X 10.9

Xcode 7+ is required.

2.0 -> 2.5.4

iOS 6

OS X 10.8

Xcode 5+ is required. NSURLSession subspec requires iOS 7 or OS X 10.9.


注意:AFNetworking的github页面中,关于版本的说明提到3.x版本中已经不再支持NSURLConnectionOperation。(在XCode7中,Apple官方废除了NSURLConnection的API)如果在之前2.x的版本中使用AFHTTPRequestOperationManager创建连接,那么在3.x的版本中应该使用AFHTTPSessionManager代替。

在AppDelegate.h文件中加入一个AFHTTPSessionManager属性

#import 
#import "AFURLSessionManager.h"
#import "AFHTTPSessionManager.h"

@interface FKAppDelegate : UIResponder 

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) AFHTTPSessionManager* manager;
@end

然后在AppDelegate.m文件的didFinishLaunchingWithOptions:方法中为AFHTTPSessionManager指定一个解析器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.manager = [AFHTTPSessionManager manager];
    self.manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
    return YES;
}

最后在视图控制器ViewController.m文件中修改按钮对应的方法

    [appDelegate.manager POST:@"http://192.168.1.110:8080/AFNetworkingTest/upload" parameters:parameters constructingBodyWithBlock:^(id formData)
    {
        [formData appendPartWithFileURL:filePath  // 指定上传的文件
                                   name:@"file"  // 指定上传文件对应的请求参数名
         // 指定上传文件的原始文件名
                               fileName:[NSString stringWithFormat:@"%@.png" , fileName]
         // 指定上传文件的MIME类型
                               mimeType:@"image/png"
                                  error:nil];
    }
 success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
     {
         // 当使用HTTP响应解析器时,服务器响应数据被封装在NSData中
         // 此处将NSData转换成NSString、并使用UIAlertView显示登录结果
         [[[UIAlertView alloc] initWithTitle:@"上传结果" message:
           [[NSString alloc] initWithData:responseObject encoding:
            NSUTF8StringEncoding] delegate:self
                           cancelButtonTitle:@"确定" otherButtonTitles:nil]
          show];
     }
 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         NSLog(@"获取服务器响应出错!");
     }];





 



你可能感兴趣的:(移动开发)