詳解Cocoa Touch網(wǎng)絡(luò)編程
詳解Cocoa Touch網(wǎng)絡(luò)編程是本文要介紹的內(nèi)容,不多說,不如我們先來看內(nèi)容。
一:確認(rèn)網(wǎng)絡(luò)環(huán)境3G/WIFI
1. 添加源文件和framework
    
開發(fā)Web等網(wǎng)絡(luò)應(yīng)用程序的時(shí)候,需要確認(rèn)網(wǎng)絡(luò)環(huán)境,連接情況等信息。如果沒有處理它們,是不會(huì)通過Apple的審查的。Apple 的 例程 Reachability 中介紹了取得/檢測(cè)網(wǎng)絡(luò)狀態(tài)的方法。要在應(yīng)用程序程序中使用Reachability,首先要完成如下兩部:
    
1.1. 添加源文件:
在你的程序中使用 Reachability 只須將該例程中的 Reachability.h 和 Reachability.m 拷貝到你的工程中。
    
1.2.添加framework:
將SystemConfiguration.framework 添加進(jìn)工程。如下圖:
    
2. 網(wǎng)絡(luò)狀態(tài)  
因此可以這樣檢查網(wǎng)絡(luò)狀態(tài):
- Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”];
 - switch ([r currentReachabilityStatus]) {
 - case NotReachable:
 - // 沒有網(wǎng)絡(luò)連接
 - break;
 - case ReachableViaWWAN:
 - // 使用3G網(wǎng)絡(luò)
 - break;
 - case ReachableViaWiFi:
 - // 使用WiFi網(wǎng)絡(luò)
 - break;
 - }
 
3.檢查當(dāng)前網(wǎng)絡(luò)環(huán)境
程序啟動(dòng)時(shí),如果想檢測(cè)可用的網(wǎng)絡(luò)環(huán)境,可以像這樣
- // 是否wifi
 - + (BOOL) IsEnableWIFI {
 - return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
 - }
 - // 是否3G
 - + (BOOL) IsEnable3G {
 - return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
 - }
 - 例子:
 - - (void)viewWillAppear:(BOOL)animated {
 - if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) &&
 - ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) {
 - self.navigationItem.hidesBackButton = YES;
 - [self.navigationItem setLeftBarButtonItem:nil animated:NO];
 - }
 - }
 
4. 鏈接狀態(tài)的實(shí)時(shí)通知
網(wǎng)絡(luò)連接狀態(tài)的實(shí)時(shí)檢查,通知在網(wǎng)絡(luò)應(yīng)用中也是十分必要的。接續(xù)狀態(tài)發(fā)生變化時(shí),需要及時(shí)地通知用戶:Reachability 1.5版本
- // My.AppDelegate.h
 - #import "Reachability.h"
 - @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
 - NetworkStatus remoteHostStatus;
 - }
 - @property NetworkStatus remoteHostStatus;
 - @end
 - // My.AppDelegate.m
 - #import "MyAppDelegate.h"
 - @implementation MyAppDelegate
 - @synthesize remoteHostStatus;
 - // 更新網(wǎng)絡(luò)狀態(tài)
 - - (void)updateStatus {
 - self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus];
 - }
 - // 通知網(wǎng)絡(luò)狀態(tài)
 - (void)reachabilityChanged:(NSNotification *)note {
 - [self updateStatus];
 - if (self.remoteHostStatus == NotReachable) {
 - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil)
 - message:NSLocalizedString (@"NotReachable", nil)
 - delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
 - [alert show];
 - [alert release];
 - }
 - }
 - // 程序啟動(dòng)器,啟動(dòng)網(wǎng)絡(luò)監(jiān)視
 - (void)applicationDidFinishLaunching:(UIApplication *)application {
 - // 設(shè)置網(wǎng)絡(luò)檢測(cè)的站點(diǎn)
 - [[Reachability sharedReachability] setHostName:@"www.apple.com"];
 - [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];
 - // 設(shè)置網(wǎng)絡(luò)狀態(tài)變化時(shí)的通知函數(shù)
 - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
 - name:@"kNetworkReachabilityChangedNotification" object:nil];
 - [self updateStatus];
 - }
 - (void)dealloc {
 - // 刪除通知對(duì)象
 - [[NSNotificationCenter defaultCenter] removeObserver:self];
 - [window release];
 - [super dealloc];
 - }
 - Reachability 2.0版本
 - // MyAppDelegate.h
 - @class Reachability;
 - @interface MyAppDelegate : NSObject <UIApplicationDelegate> {
 - Reachability *hostReach;
 - }
 - @end
 - // MyAppDelegate.m
 - (void)reachabilityChanged:(NSNotification *)note {
 - Reachability* curReach = [note object];
 - NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
 - NetworkStatus status = [curReach currentReachabilityStatus];
 - if (status == NotReachable) {
 - UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName""
 - message:@"NotReachable"
 - delegate:nil
 - cancelButtonTitle:@"YES" otherButtonTitles:nil];
 - [alert show];
 - [alert release];
 - }
 - }
 - (void)applicationDidFinishLaunching:(UIApplication *)application {
 - // ...
 - // 監(jiān)測(cè)網(wǎng)絡(luò)情況
 - [[NSNotificationCenter defaultCenter] addObserver:self
 - selector:@selector(reachabilityChanged:)
 - name: kReachabilityChangedNotification
 - object: nil];
 - hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
 - hostReach startNotifer];
 - // ...
 - }
 
二:使用NSConnection下載數(shù)據(jù)
    
1.創(chuàng)建NSConnection對(duì)象,設(shè)置委托對(duì)象
- NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];
 - [NSURLConnection connectionWithRequest:request delegate:self];
 
2. NSURLConnection delegate委托方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
 
3. 實(shí)現(xiàn)委托方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
 - // store data
 - [self.receivedData setLength:0]; //通常在這里先清空接受數(shù)據(jù)的緩存
 - }
 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
 - /* appends the new data to the received data */
 - [self.receivedData appendData:data]; //可能多次收到數(shù)據(jù),把新的數(shù)據(jù)添加在現(xiàn)有數(shù)據(jù)最后
 - }
 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
 - // 錯(cuò)誤處理
 - }
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
 - // disconnect
 - [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
 - NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding];
 - NSLog(returnString);
 - [self urlLoaded:[self urlString] data:self.receivedData];
 - firstTimeDownloaded = YES;
 - }
 
三:使用NSXMLParser解析xml文件
1. 設(shè)置委托對(duì)象,開始解析
- NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; //或者也可以使用initWithContentsOfURL直接下載文件,但是有一個(gè)原因不這么做:
 - // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable
 - // because it gives less control over the network, particularly in responding to connection errors.
 - [parser setDelegate:self];
 - [parser parse];
 
2. 常用的委托方法
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
 - namespaceURI:(NSString *)namespaceURI
 - qualifiedName:(NSString *)qName
 - attributes:(NSDictionary *)attributeDict;
 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
 - namespaceURI:(NSString *)namespaceURI
 - qualifiedName:(NSString *)qName;
 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
 - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
 - static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml";
 
3. 應(yīng)用舉例
- (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
 - {
 - NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
 - [parser setDelegate:self];
 - [parser setShouldProcessNamespaces:NO];
 - [parser setShouldReportNamespacePrefixes:NO];
 - [parser setShouldResolveExternalEntities:NO];
 - [parser parse];
 - NSError *parseError = [parser parserError];
 - if (parseError && error) {
 - *error = parseError;
 - }
 - [parser release];
 - }
 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
 - qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{
 - // 元素開始句柄
 - if (qName) {
 - elementName = qName;
 - }
 - if ([elementName isEqualToString:@"user"]) {
 - // 輸出屬性值
 - NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]);
 - }
 - }
 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
 - qualifiedName:(NSString *)qName
 - {
 - // 元素終了句柄
 - if (qName) {
 - elementName = qName;
 - }
 - }
 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
 - {
 - // 取得元素的text
 - }
 - NSError *parseError = nil;
 - [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];
 
小結(jié):詳解Cocoa Touch網(wǎng)絡(luò)編程的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!















 
 
 
 
 
 
 