详解Cocoa Touch网络编程

移动开发 iOS
本文介绍的是Cocoa Touch网络编程,很详细的为大家介绍网络编程的过程,我们先来看内容。

详解Cocoa Touch网络编程是本文要介绍的内容,不多说,不如我们先来看内容。

一:确认网络环境3G/WIFI

1. 添加源文件和framework
   
开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:
   
1.1. 添加源文件:

在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。
   
1.2.添加framework:

将SystemConfiguration.framework 添加进工程。如下图:
   
2. 网络状态  

因此可以这样检查网络状态:

  1. Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];  
  2. switch ([r currentReachabilityStatus]) {  
  3.         case NotReachable:  
  4.                 // 没有网络连接  
  5.                 break;  
  6.         case ReachableViaWWAN:  
  7.                 // 使用3G网络  
  8.                 break;  
  9.         case ReachableViaWiFi:  
  10.                 // 使用WiFi网络  
  11.                 break;  

3.检查当前网络环境

程序启动时,如果想检测可用的网络环境,可以像这样

  1. // 是否wifi  
  2. + (BOOL) IsEnableWIFI {  
  3.     return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);  
  4. }  
  5.  
  6. // 是否3G  
  7. + (BOOL) IsEnable3G {  
  8.     return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);  
  9. }  
  10. 例子:  
  11. - (void)viewWillAppear:(BOOL)animated {      
  12. if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&   
  13.         ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {  
  14.         self.navigationItem.hidesBackButton = YES;  
  15.         [self.navigationItem setLeftBarButtonItem:nil animated:NO];  
  16.     }  

4. 链接状态的实时通知

网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:Reachability 1.5版本

  1.  // My.AppDelegate.h  
  2.     #import "Reachability.h"  
  3.  
  4.     @interface MyAppDelegate : NSObject <UIApplicationDelegate> {  
  5.         NetworkStatus remoteHostStatus;  
  6.     }  
  7.  
  8.     @property NetworkStatus remoteHostStatus;  
  9.  
  10.     @end  
  11.  
  12.     // My.AppDelegate.m  
  13.     #import "MyAppDelegate.h"  
  14.  
  15.     @implementation MyAppDelegate  
  16.     @synthesize remoteHostStatus;  
  17.  
  18.     // 更新网络状态  
  19.     - (void)updateStatus {  
  20.         self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];  
  21.     }  
  22.  
  23.     // 通知网络状态  
  24. (void)reachabilityChanged:(NSNotification *)note {  
  25.         [self updateStatus];  
  26.         if (self.remoteHostStatus == NotReachable) {  
  27.             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)  
  28.                          message:NSLocalizedString (@"NotReachable", nil)  
  29.                         delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];  
  30.             [alert show];  
  31.             [alert release];  
  32.         }  
  33.     }  
  34.  
  35.     // 程序启动器,启动网络监视  
  36. (void)applicationDidFinishLaunching:(UIApplication *)application {  
  37.       
  38.         // 设置网络检测的站点  
  39.         [[Reachability sharedReachability] setHostName:@"www.apple.com"];  
  40.         [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];  
  41.         // 设置网络状态变化时的通知函数  
  42.         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)  
  43.                                                  name:@"kNetworkReachabilityChangedNotification" object:nil];  
  44.         [self updateStatus];  
  45.     }  
  46.  
  47.  (void)dealloc {  
  48.         // 删除通知对象  
  49.         [[NSNotificationCenter defaultCenter] removeObserver:self];  
  50.         [window release];  
  51.         [super dealloc];  
  52.     }   
  53.       
  54.     Reachability 2.0版本  
  55.       
  56.  
  57.     // MyAppDelegate.h  
  58.     @class Reachability;  
  59.  
  60.         @interface MyAppDelegate : NSObject <UIApplicationDelegate> {  
  61.             Reachability  *hostReach;  
  62.         }  
  63.  
  64.     @end  
  65.  
  66.     // MyAppDelegate.m  
  67. (void)reachabilityChanged:(NSNotification *)note {  
  68.         Reachability* curReach = [note object];  
  69.         NSParameterAssert([curReach isKindOfClass: [Reachability class]]);  
  70.         NetworkStatus status = [curReach currentReachabilityStatus];  
  71.       
  72.         if (status == NotReachable) {  
  73.             UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""  
  74.                               message:@"NotReachable"  
  75.                               delegate:nil  
  76.                               cancelButtonTitle:@"YES" otherButtonTitles:nil];  
  77.                               [alert show];  
  78.                               [alert release];  
  79.         }  
  80.     }  
  81.                                 
  82. (void)applicationDidFinishLaunching:(UIApplication *)application {  
  83.         // ...  
  84.                     
  85.         // 监测网络情况  
  86.         [[NSNotificationCenter defaultCenter] addObserver:self  
  87.                               selector:@selector(reachabilityChanged:)  
  88.                               name: kReachabilityChangedNotification  
  89.                               object: nil];  
  90.         hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];  
  91.         hostReach startNotifer];  
  92.         // ...  
  93.     } 

二:使用NSConnection下载数据
   
1.创建NSConnection对象,设置委托对象

  1. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];  
  2. [NSURLConnection connectionWithRequest:request delegate:self]; 

2. NSURLConnection delegate委托方法

  1.  (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;    
  2.  (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;    
  3. (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;    
  4.  (void)connectionDidFinishLoading:(NSURLConnection *)connection;   

3. 实现委托方法

  1.  (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {  
  2.         // store data  
  3.         [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存  
  4.     }  
  5.       
  6. (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {  
  7.            /* appends the new data to the received data */  
  8.         [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后  
  9.     }  
  10.  
  11.  (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {  
  12.         // 错误处理  
  13.     }  
  14.  
  15.  (void)connectionDidFinishLoading:(NSURLConnection *)connection {  
  16.         // disconnect  
  17.         [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;     
  18.         NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];  
  19.         NSLog(returnString);  
  20.         [self urlLoaded:[self urlString] data:self.receivedData];  
  21.         firstTimeDownloaded = YES;  
  22.     } 

三:使用NSXMLParser解析xml文件

1. 设置委托对象,开始解析

  1. NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:  
  2. // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable  
  3. // because it gives less control over the network, particularly in responding to connection errors.  
  4. [parser setDelegate:self];  
  5. [parser parse]; 

 

2. 常用的委托方法

  1. (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName   
  2.                                 namespaceURI:(NSString *)namespaceURI  
  3.                                 qualifiedName:(NSString *)qName   
  4.                                 attributes:(NSDictionary *)attributeDict;  
  5. (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName   
  6.                                 namespaceURI:(NSString *)namespaceURI   
  7.                                 qualifiedName:(NSString *)qName;  
  8.  (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;  
  9. (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;  
  10.  
  11.     static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; 

3.  应用举例

  1.  (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error  
  2.     {  
  3.         NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];  
  4.         [parser setDelegate:self];  
  5.         [parser setShouldProcessNamespaces:NO];  
  6.         [parser setShouldReportNamespacePrefixes:NO];  
  7.         [parser setShouldResolveExternalEntities:NO];  
  8.         [parser parse];  
  9.         NSError *parseError = [parser parserError];  
  10.         if (parseError && error) {  
  11.             *error = parseError;  
  12.         }  
  13.         [parser release];  
  14.     }  
  15.  
  16. (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI   
  17.                                         qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{  
  18.         // 元素开始句柄  
  19.         if (qName) {  
  20.             elementName = qName;  
  21.         }  
  22.         if ([elementName isEqualToString:@"user"]) {  
  23.             // 输出属性值  
  24.             NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);  
  25.         }  
  26.     }  
  27.  
  28. (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI   
  29.                                         qualifiedName:(NSString *)qName  
  30.     {  
  31.         // 元素终了句柄  
  32.         if (qName) {  
  33.                elementName = qName;  
  34.         }  
  35.     }  
  36.  
  37. (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string  
  38.     {  
  39.         // 取得元素的text  
  40.     }  
  41. NSError *parseError = nil;  
  42.     [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 

小结:详解Cocoa Touch网络编程的内容介绍完了,希望本文对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-11 15:46:55

CocoaCocoa Touch框架

2011-08-10 16:27:07

Cocoa TouchPlist

2011-05-11 10:28:03

2011-07-08 11:13:42

Cocoa Touch XCode

2011-08-03 10:24:22

Cocoa Touch 静态库

2011-07-18 15:08:34

2011-06-15 16:11:51

UIKitCocoa TouchiOS

2011-08-15 15:56:29

Cocoa编程模块

2011-08-05 17:54:33

Cocoa Touch 多语言

2011-07-08 10:49:59

Cocoa Touch 静态库

2011-05-31 15:41:00

Cocoa TouchCocoaiOS

2011-08-10 18:47:18

Cocoa字符串

2011-06-27 15:39:51

Cocoa Touch

2011-06-27 16:00:34

视频教程Cocoa TouchiOS应用

2011-07-22 15:50:06

Cocoa MVC 视图

2011-08-15 14:47:28

Cocoa嵌入资源文件

2011-07-26 15:29:36

Cocoa 模式

2011-07-28 16:52:34

Cocoa 框架 Mac Os

2011-08-02 13:58:18

Cocoa 框架 Mac OS

2011-08-15 14:27:51

CocoaRunLoop
点赞
收藏

51CTO技术栈公众号