AFNetworking - 强大的iOS网络请求库

0 阅读2分钟

项目标题与描述

AFNetworking是一个优雅的iOS、macOS、watchOS和tvOS网络请求库。它建立在Foundation URL加载系统之上,扩展了强大的高级功能。项目目前已经归档,不再维护,建议迁移到Alamofire(Swift版本)。

功能特性

  • HTTP请求管理:提供AFHTTPSessionManager简化HTTP请求
  • 请求和响应序列化:支持JSON、XML、Property List等格式
  • 安全策略:支持SSL证书验证和公钥固定
  • 网络可达性监控:实时检测网络状态变化
  • UIKit集成:为UIImageView、UIButton等提供网络加载扩展
  • 后台任务支持:完善的后台任务处理机制
  • 进度跟踪:上传和下载进度监控
  • 缓存控制:内置请求缓存管理

安装指南

CocoaPods安装

在Podfile中添加:

pod 'AFNetworking', '~> 4.0'

手动安装

  1. 下载AFNetworking源代码
  2. 将AFNetworking目录添加到项目中
  3. 链接系统依赖框架:
    • Foundation.framework
    • SystemConfiguration.framework
    • Security.framework
    • MobileCoreServices.framework (iOS)
    • CoreServices.framework (macOS)

使用说明

基本GET请求

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager GET:@"https://api.example.com/data" 
  parameters:nil 
     headers:nil 
    progress:nil 
     success:^(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } 
     failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

图片加载

NSURL *url = [NSURL URLWithString:@"https://example.com/image.png"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

[imageView setImageWithURLRequest:request 
                 placeholderImage:nil 
                          success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
                              imageView.image = image;
                          } 
                          failure:nil];

网络状态监控

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];

核心代码

AFHTTPSessionManager 核心实现

// AFHTTPSessionManager.h
@interface AFHTTPSessionManager : AFURLSessionManager <NSSecureCoding, NSCopying>

@property (readonly, nonatomic, strong) NSURL *baseURL;
@property (nonatomic, strong) AFHTTPRequestSerializer <AFURLRequestSerialization> * requestSerializer;
@property (nonatomic, strong) AFHTTPResponseSerializer <AFURLResponseSerialization> * responseSerializer;

+ (instancetype)manager;
- (instancetype)initWithBaseURL:(nullable NSURL *)url;
- (instancetype)initWithBaseURL:(nullable NSURL *)url 
           sessionConfiguration:(nullable NSURLSessionConfiguration *)configuration;

// HTTP请求方法
- (nullable NSURLSessionDataTask *)GET:(NSString *)URLString
                            parameters:(nullable id)parameters
                               headers:(nullable NSDictionary <NSString *, NSString *> *)headers
                              progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress
                               success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                               failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;
// 其他HTTP方法...
@end

网络可达性监控

// AFNetworkReachabilityManager.h
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
    AFNetworkReachabilityStatusUnknown          = -1,
    AFNetworkReachabilityStatusNotReachable     = 0,
    AFNetworkReachabilityStatusReachableViaWWAN = 1,
    AFNetworkReachabilityStatusReachableViaWiFi = 2,
};

@interface AFNetworkReachabilityManager : NSObject

@property (readonly, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus;
@property (readonly, nonatomic, assign, getter = isReachable) BOOL reachable;
@property (readonly, nonatomic, assign, getter = isReachableViaWWAN) BOOL reachableViaWWAN;
@property (readonly, nonatomic, assign, getter = isReachableViaWiFi) BOOL reachableViaWiFi;

+ (instancetype)sharedManager;
+ (instancetype)manager;
+ (instancetype)managerForDomain:(NSString *)domain;
+ (instancetype)managerForAddress:(const void *)address;

- (instancetype)initWithReachability:(SCNetworkReachabilityRef)reachability;

- (void)startMonitoring;
- (void)stopMonitoring;

- (void)setReachabilityStatusChangeBlock:(nullable void (^)(AFNetworkReachabilityStatus status))block;

@end

更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手) 公众号二维码