iPhone网络开发教程

移动开发 iOS
iPhone网络开发教程是本文要介绍的内容,开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。

iPhone网络开发教程是本文要介绍的内容,详细的讲解了iphone网络的开发。不多说,一起来看详细内容。

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

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

在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:
    
1.2.添加framework:
   
将SystemConfiguration.framework 添加进工程。如下图:
   
2、网络状态
    
Reachability.h中定义了三种网络状态:

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


二、使用NSConnection下载数据

1、创建NSConnection对象,设置委托对象

  1.  
  2. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]];  
  3. [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.         
  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;  

三、使用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. 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. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string  
  37. {  
  38.     // 取得元素的text  
  39. }  
  40. NSError *parseError = nil;  
  41. [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 

小结:iPhone网络开发教程的内容介绍完了,希望通过本文的学习对你有所帮助!

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

2011-08-05 16:10:31

iPhone 网络 NSURLConne

2011-07-08 16:02:24

iphone

2011-08-10 18:24:22

iPhone 图形 绘图

2011-07-08 14:58:16

iPhone Xcode iOS

2011-08-02 17:37:01

IPhone开发 环境搭建

2011-07-18 09:35:29

iPhone 框架

2011-07-21 10:29:18

iPhone 开发

2011-08-09 13:10:32

iPhone地图开发

2011-07-21 14:07:29

iPhone 网络 流量

2011-08-16 10:01:02

2011-07-27 17:24:31

iPhone NSXMLParse XML

2011-08-22 12:01:38

iPhone开发文件

2011-08-08 18:19:09

iPhone音频播放

2011-08-10 10:23:20

iPhoneArchivingNSCoder

2011-07-18 12:29:10

2011-07-18 11:23:29

iPhone 游戏 动画

2011-07-18 11:39:58

iPhone 游戏 引擎

2011-07-27 16:46:04

iPhone iPhone破解 MacPort

2011-08-12 10:09:23

iPhone开发多线程

2011-07-18 11:07:12

iPhone 游戏 引擎
点赞
收藏

51CTO技术栈公众号