本文为自己在学习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.h和AFHTTPRequestOperationManager.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
- (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(@"获取服务器响应出错!");
}];