AFNetworkingネットワークフレームの基本使用

13617 ワード

AFM
一、何がAFMですか
全称はAFNetworkingで、NSURLConnectに対するパッケージです。
運行効率はASIほど高くないですが、ASIよりも使いやすいです。
iOS開発では、広く使用されています。
 
二、AFM構造
NSURLConnection
 
AFRURLConnection Operation
AHTTPRequest Operation
AHTTPRequest OperationManager(一般的なHTTPを封入した方法)
 
属性
 
baseURL:AFNは、AHTTPrequest OperationManagerに対して、一例クラスをカスタマイズし、baseURLを設定し、すべてのネットワークアクセスは、相対パスだけでいいです。
request Serializer:要求データフォーマット/デフォルトはバイナリのHTTP
レスポンスデータフォーマット/デフォルトはJSON形式です。
operation Que
reachability Manager:ネットワーク接続マネージャ
方法
 
マネージャーのクラスを作成するのに便利な方法
HTTPRequest Operation WithRequest:サーバにアクセスする時、サーバーにいくつかの追加情報を教えるなら、すべてRequestに設定する必要があります。
GET
POST
NSURLSession
 
AFRURLSessionManager
AHTTPSession Manager(一般的なHTTPを封入した方法)
 
GET
POST
UIKEt+AFNetworking分類
NSProgress:KVOを利用する
半自動のプログレッシブ&アンチプログレッシブ機能
 
AFRURL Request Serialization:要求されたデータフォーマット/デフォルトはバイナリです。
AFRURL ResonseSerialization:レスポンスデータフォーマット/デフォルトはJSON形式です。
付加機能
 
セキュリティポリシー
 
HTTPS
AFSecurityPolicy
ネットワーク検出
 
アップルのネットワーク接続検査をパッケージ化しました。
AFNetwork Reachability Manager
三、AFMは基本的に使用します。
1.AHTTPSession Manager
AFMの中で最も重要なオブジェクトの一つです。
HTTP要求を実装した一般的な処理
GET\POSTリクエスト
解析サーバの応答データ
AHTTPSession Managerを作成します。
 
AHTTPSession Manager*mgr=[AHTTPSession Manager manager manager]
AHTTPSession ManagerのGET\POST要請
 
//GET要求
/*
     http://120.25.226.186:32812/login?username=520it&pwd=520it
     最初のパラメータ:要求されたアドレス http://120.25.226.186:32812/login
     二つ目のパラメータ:要求のパラメータ username=520 it&pwd=520 it
     3番目のパラメータ:成功のコールバックを要求します。
     4番目のパラメータ:要求失敗のコールバック
     AFMを利用して要求を送信すると、サーバーがJSONデータを返したら、AFMは自動的にJSONをOCオブジェクトに移籍して返してくれます。
     */
-(NSURLSessitionDataTask*)GET:(NSString*)URLString
                   parameters:(id)parameters
                   success:(void(^^)(NSURLSessitionDataTask*task,idesレスポンスObject)success
                   failure:(void(^^)(NSURLSessitionDataTask*task,NSError*error)failure
 
//POSTリクエスト
-(NSURLSessitionDataTask*)POST:(NSString*)URLString
                   parameters:(id)parameters
                   success:(void(^^)(NSURLSessitionDataTask*task,idesレスポンスObject)success
                   failure:(void(^^)(NSURLSessitionDataTask*task,NSError*error)failure
コードの例:
// GET
- (void)get2
{
    // 1.  AFN   
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 
    // 2.  AFN       
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
 
    [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^
(NSURLSessionDataTask *task, id responseObject) {
         NSLog(@"    ---%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"    ---%@", error);
    }];
}
 
// POST
- (void)post2
{
    // 1.  AFN   
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 
    // 2.  AFN       
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
 
    [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^
(NSURLSessionDataTask *task, id responseObject) {
        NSLog(@"    ---%@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        NSLog(@"    ---%@", error);
    }];
}
2.AHTTPRequest OperationManager
  AFHTTPRequestOperationManager
 
// 1.  AFN   
    // AFHTTPRequestOperationManager     NSURLConnection
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFHTTPRequestOperationManager GET\POST  
 
// GET
- (NSURLSessionDataTask *)GET:(NSString *)URLString
                   parameters:(id)parameters
                      success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                      failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
 
// POST  
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
                       success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                       failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
コードの例:
- (void)get
{
    // 1.  AFN   
    // AFHTTPRequestOperationManager     NSURLConnection
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 
    // 2.  AFN       
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
    [manager GET:@"http://120.25.226.186:32812/login" parameters:params success:^
(AFHTTPRequestOperation *operation, id responseObject) {
         NSLog(@"    ---%@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"    ---%@", error);
    }];
}
 
- (void)post
{
    // 1.  AFN   
    // AFHTTPRequestOperationManager     NSURLConnection
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
 
    // 2.  AFN       
    NSDictionary *params = @{
                             @"username" : @"520it",
                             @"pwd" : @"520it"
                             };
    [manager POST:@"http://120.25.226.186:32812/login" parameters:params success:^
(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"    ---%@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"    ---%@", error);
    }];
}
四、AFMファイルのダウンロード
//          ,        
- (void)downLoadMonitor
{
    // 1.       
    // AFHTTPSessionManager   NSURLSession
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 
    // 2.           
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@
"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]];
    /*
     destination
     - targetPath:               
     - block    ,       URL,      URL          
     completionHandler
     - url :destination   URL == block      
     */
    /*
     @property int64_t totalUnitCount;            
     @property int64_t completedUnitCount;          
     */
    NSProgress *progress = nil;
    NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request 
progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
 
        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 
NSUserDomainMask, YES) lastObject];
        NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
        return [NSURL fileURLWithPath:path];
 
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"%@",filePath.absoluteString);
 
    }];
 
    /*
          ,     NSProgress,   iOS 7.0    ,          !
     NSProgress      !      !-> KVO         !
     @property int64_t totalUnitCount;            
     @property int64_t completedUnitCount;         
     */
    //  Progress     KVO
    [progress addObserver:self forKeyPath:@"completedUnitCount" 
options:NSKeyValueObservingOptionNew context:nil];
 
    // 3.    
    [downTask resume];
 
}
 
//          
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)object 
change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"%f",1.0 * object.completedUnitCount / object.totalUnitCount);
    //        UI
    dispatch_async(dispatch_get_main_queue(), ^{
 
        self.progress.progress = 1.0 * object.completedUnitCount / object.totalUnitCount;
    });
}
五、AFMプロローグ
デフォルトはJSONデータ、受信タイプはJSONです。
 
受信のタイプと戻るタイプが一致しないとエラーが発生します。
// 1.  AFN   
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 
    //        
    //      JSON
 
    //   AFN,     text/xml    
    // [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet 
setWithObject:@"text/xml"];
 
    //   AFN      
    //   AFN   ,         JSON   ,     JSON  
//    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    //   AFN   ,         XML   
//    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    //   AFN   ,                (           )
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
六、AFMファイルアップロード
// formData:              
- (NSURLSessionDataTask *)POST:(NSString *)URLString
                    parameters:(id)parameters
     constructingBodyWithBlock:(void (^)(id  formData))block
                    success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
                    failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
AFMアップロードファイルコード例:
// 1.       
  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  // 2.           
  NSDictionary *dict = @{@"username":@"Syl"};
  // formData:              
  [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict 
constructingBodyWithBlock:
   ^void(id formData) {
 
      /*
       Data:        
       name:         
       fileName:     
       mimeType:      
       */
      UIImage *image =[UIImage imageNamed:@"minion_02"];
      NSData *data = UIImagePNGRepresentation(image);
      [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" 
mimeType:@"image/png"];
 
      /*
       NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/
CertificateSigningRequest.certSigningRequest"];
       //         MIMEType application/octet-stream
       // [formData appendPartWithFileURL:url name:@"file" fileName:@"abc.cer" 
mimeType:@"application/octet-stream" error:nil];
       [formData appendPartWithFileURL:url name:@"file" error:nil];
      */
  } success:^void(NSURLSessionDataTask * task, id responseObject) {
      //     
      NSLog(@"     %@", responseObject);
  } failure:^void(NSURLSessionDataTask * task, NSError * error) {
      //     
      NSLog(@"     %@", error);
  }];
七、ネットワーク状態を監視する
1.AFMモニタネットワーク状態
ネットワーク状態status
// 2.    
    /*
     AFNetworkReachabilityStatusUnknown          = -1,     
     AFNetworkReachabilityStatusNotReachable     = 0,      
     AFNetworkReachabilityStatusReachableViaWWAN = 1,   3G
     AFNetworkReachabilityStatusReachableViaWiFi = 2,  wifi
     */
    
 
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
 
//   :         ,         startMonitoring  
[manager startMonitoring];
 
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"%d", status);
}];
2.Reachability ,
// 1.  wifi  
    Reachability *wifi = [Reachability reachabilityForLocalWiFi];
 
    // 2.          (WIFI\3G\2.5G)
    Reachability *conn = [Reachability reachabilityForInternetConnection];
 
    // 3.      
    if ([wifi currentReachabilityStatus] != NotReachable) { //  wifi
        NSLog(@" wifi");
 
    } else if ([conn currentReachabilityStatus] != NotReachable) { 
//     wifi,             
        NSLog(@"            ");
 
    } else { //     
 
        NSLog(@"    ");
    }
①      
 
//  WIFI
// [wifi currentReachabilityStatus] != NotReachable
// [conn currentReachabilityStatus] != NotReachable
 
//    WIFI,        
// [wifi currentReachabilityStatus] == NotReachable
// [conn currentReachabilityStatus] != NotReachable
 
//     
// [wifi currentReachabilityStatus] == NotReachable
// [conn currentReachabilityStatus] == NotReachable
②        
 
#import "ViewController.h"
#import "Reachability.h"
 
@interface HMViewController ()
@property (nonatomic, strong) Reachability *conn;
@end
 
@implementation HMViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkState)
 name:kReachabilityChangedNotification object:nil];
    self.conn = [Reachability reachabilityForInternetConnection];
    [self.conn startNotifier];
}
 
- (void)dealloc
{
    [self.conn stopNotifier];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
 
- (void)checkNetworkState
{
    // 1.  wifi  
    Reachability *wifi = [Reachability reachabilityForLocalWiFi];
 
    // 2.          (WIFI\3G\2.5G)
    Reachability *conn = [Reachability reachabilityForInternetConnection];
 
    // 3.      
    if ([wifi currentReachabilityStatus] != NotReachable) { //  wifi
        NSLog(@" wifi");
 
    } else if ([conn currentReachabilityStatus] != NotReachable) { 
//     wifi,             
        NSLog(@"            ");
 
    } else { //     
 
        NSLog(@"    ");
    }
}
@end