詳解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)用程序的時候,需要確認(rèn)網(wǎng)絡(luò)環(huán)境,連接情況等信息。如果沒有處理它們,是不會通過Apple的審查的。Apple 的 例程 Reachability 中介紹了取得/檢測網(wǎng)絡(luò)狀態(tài)的方法。要在應(yīng)用程序程序中使用Reachability,首先要完成如下兩部:
1.1. 添加源文件:
在你的程序中使用 Reachability 只須將該例程中的 Reachability.h 和 Reachability.m 拷貝到你的工程中。
1.2.添加framework:
將SystemConfiguration.framework 添加進工程。如下圖:
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)境
程序啟動時,如果想檢測可用的網(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)的實時通知
網(wǎng)絡(luò)連接狀態(tài)的實時檢查,通知在網(wǎng)絡(luò)應(yīng)用中也是十分必要的。接續(xù)狀態(tài)發(fā)生變化時,需要及時地通知用戶: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];
- }
- }
- // 程序啟動器,啟動網(wǎng)絡(luò)監(jiān)視
- (void)applicationDidFinishLaunching:(UIApplication *)application {
- // 設(shè)置網(wǎng)絡(luò)檢測的站點
- [[Reachability sharedReachability] setHostName:@"www.apple.com"];
- [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES];
- // 設(shè)置網(wǎng)絡(luò)狀態(tài)變化時的通知函數(shù)
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
- name:@"kNetworkReachabilityChangedNotification" object:nil];
- [self updateStatus];
- }
- (void)dealloc {
- // 刪除通知對象
- [[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)測網(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對象,設(shè)置委托對象
- 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. 實現(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 {
- // 錯誤處理
- }
- (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è)置委托對象,開始解析
- NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; //或者也可以使用initWithContentsOfURL直接下載文件,但是有一個原因不這么做:
- // 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)容介紹完了,希望本文對你有所幫助!