开发web应用总纲

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

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

 
     
 
     
 
      1.2.添加framework:
 
      将SystemConfiguration.framework添加进工程。如下图:
 
     
 
     
 
      2.网络状态
 
     
 
      Reachability.h中定义了三种网络状态:
 
      typedefenum {
 
              NotReachable=0,                        //无连接
 
              ReachableViaWiFi,                        //使用3G/GPRS网络
 
              ReachableViaWWAN                        //使用WiFi网络
 
      }NetworkStatus;
 
     
 
      因此可以这样检查网络状态:

 
      Reachability*r = [Reachability reachabilityWithHostName :@“www.apple.com”];
 
      switch([r currentReachabilityStatu s]) {
 
                      caseNotReachable:
 
                                      //没有网络连接
 
                                      break;
 
                      caseReachableViaWWAN:
 
                                      //使用3G网络
 
                                      break;
 
                      caseReachableViaWiFi:
 
                                      //使用WiFi网络
 
                                      break;
 
      }
 
     
 
      3.检查当前网络环境
 
      程序启动时,如果想检测可用的网络环境,可以像这样
 
      //是否wifi
 
      +(BOOL) IsEnableWIFI {
 
              return([[Reachability reachabilityForLocalWiFi ]currentReachabilityStatu s] != NotReachable);
 
      }

 
      //是否3G
 
      +(BOOL) IsEnable3G {
 
              return([[Reachability reachabilityForInternetC onnection]currentReachabilityStatu s] != NotReachable);
 
      }
 
      例子:
 
      -(void)viewWillAppear:(BOOL)animated{       
 
      if(([ReachabilityreachabilityForInternetC onnection].currentReachabilityStatu s ==NotReachable) &&
 
                      ([ReachabilityreachabilityForLocalWiFi ].currentReachabilityStatu s ==NotReachable)) {
 
                      self.navigationItem.hidesBackButton= YES;
 
                      [self.navigationItemsetLeftBarButtonItem:nil animated:NO];
 
              }
 
      }

 
      4.链接状态的实时通知
 
      网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:
 
     
 
      Reachability1.5版本
 
      //My.AppDelegate.h
 
      #import"Reachability.h"

 
      @interfaceMyAppDelegate : NSObject<UIApplicationDelegate> {
 
              NetworkStatusremoteHostStatus;
 
      }

 
      @propertyNetworkStatus remoteHostStatus;

 
      @end

 
      //My.AppDelegate.m
 
      #import"MyAppDelegate.h"

 
      @implementationMyAppDelegate
 
      @synthesizeremoteHostStatus;

 
      //更新网络状态
 
      -(void)updateStatus {
 
              self.remoteHostStatus= [[Reachability sharedReachability] remoteHostStatus];
 
      }

 
      //通知网络状态
 
      -(void)reachabilityChanged:(NSNotification *)note {
 
              [selfupdateStatus];
 
              if(self.remoteHostStatus == NotReachable) {
 
                      UIAlertView*alert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"AppName", nil)
 
                                              message:NSLocalizedString (@"NotReachable", nil)
 
                                              delegate:nilcancelButtonTitle:@"OK" otherButtonTitles: nil];
 
                      [alertshow];
 
                      [alertrelease];
 
              }
 
      }

 
      //程序启动器,启动网络监视
 
      -(void)applicationDidFinishLaun ching:(UIApplication *)application{
 
     
 
              //设置网络检测的站点
 
              [[ReachabilitysharedReachability] setHostName:@"www.apple.com"];
 
              [[ReachabilitysharedReachability]setNetworkStatusNotifica tionsEnabled:YES];
 
              //设置网络状态变化时的通知函数
 
              [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(reachabilityChanged:)
 
                                                                                              name:@"kNetworkReachabilityChan gedNotification" object:nil];
 
              [selfupdateStatus];
 
      }

 
      -(void)dealloc {
 
              //删除通知对象
 
              [[NSNotificationCenterdefaultCenter] removeObserver:self];
 
              [windowrelease];
 
              [superdealloc];
 
      }
 
     
 
      Reachability2.0版本
 
     

 
      //MyAppDelegate.h
 
      @classReachability;

 
              @interfaceMyAppDelegate : NSObject<UIApplicationDelegate> {
 
                      Reachability    *hostReach;
 
              }

 
      @end

 
      //MyAppDelegate.m
 
      -(void)reachabilityChanged:(NSNotification *)note {
 
              Reachability*curReach = [note object];
 
              NSParameterAssert([curReachisKindOfClass: [Reachability class]]);
 
              NetworkStatusstatus = [curReach currentReachabilityStatu s];
 
     
 
              if(status == NotReachable) {
 
                      UIAlertView*alert = [[UIAlertView alloc] initWithTitle:@"AppName""
 
                                                          message:@"NotReachable"
 
                                                          delegate:nil
 
                                                          cancelButtonTitle:@"YES"otherButtonTitles:nil];
 
                                                          [alertshow];
 
                                                          [alertrelease];
 
              }
 
      }
 
                                                         
 
      -(void)applicationDidFinishLaun ching:(UIApplication *)application{
 
              //...
 
                                 
 
              //监测网络情况
 
              [[NSNotificationCenterdefaultCenter] addObserver:self
 
                                                          selector:@selector(reachabilityChanged:)
 
                                                          name:kReachabilityChangedNoti fication
 
                                                          object:nil];
 
              hostReach= [[Reachability reachabilityWithHostName :@"www.google.com"]retain];
 
              hostReachstartNotifer];
 
              //...
 
      }


二:使用NSConnection下载数据
 
     
 
      1.创建NSConnection对象,设置委托对象
 
     
 
      NSMutableURLRequest*request = [NSMutableURLRequest requestWithURL:[NSURLURLWithString:[self urlString]]];
 
      [NSURLConnectionconnectionWithRequest: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)connectionDidFinishLoadi ng:(NSURLConnection  *)connection;   

 
      3.实现委托方法
 
      -(void)connection:(NSURLConnection *)connectiondidReceiveResponse:(NSURLResponse *)response {
 
              //store data
 
              [self.receivedDatasetLength:0];                        //通常在这里先清空接受数据的缓存
 
      }
 
     
 
      -(void)connection:(NSURLConnection *)connectiondidReceiveData:(NSData *)data {
 
                 
 
              [self.receivedDataappendData:data];                //可能多次收到数据,把新的数据添加在现有数据最后
 
      }

 
      -(void)connection:(NSURLConnection *)connectiondidFailWithError:(NSError *)error {
 
              //错误处理
 
      }

 
      -(void)connectionDidFinishLoadi ng:(NSURLConnection *)connection{
 
              //disconnect
 
              [UIApplicationsharedApplication].networkActivityIndicator Visible =NO;   
 
              NSString*returnString = [[NSString alloc] initWithData:self.receivedDataencoding:NSUTF8StringEncoding];
 
              NSLog(returnString);
 
              [selfurlLoaded:[self urlString] data:self.receivedData];
 
              firstTimeDownloaded= YES;
 
      }

三:使用NSXMLParser解析xml文件

 
      1.设置委托对象,开始解析
 
      NSXMLParser*parser = [[NSXMLParser alloc]initWithData:data];    //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:
 
      //It's also possible to have NSXMLParser download the data, bypassing it a URL, but this is not desirable
 
      //because it gives less control over the network, particularly inresponding to connection errors.
 
      [parsersetDelegate:self];
 
      [parserparse];

 
      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;

 
      staticNSString *feedURLString =@"http://www.yifeiyang.net/test/test.xml";

 
      3.    应用举例
 
      -(void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError**)error
 
      {
 
              NSXMLParser*parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
 
              [parsersetDelegate:self];
 
              [parsersetShouldProcessNamespac es:NO];
 
              [parsersetShouldReportNamespace Prefixes:NO];
 
              [parsersetShouldResolveExternal Entities:NO];
 
              [parserparse];
 
              NSError*parseError = [parser parserError];
 
              if(parseError && error) {
 
                      *error= parseError;
 
              }
 
              [parserrelease];
 
      }

 
      -(void)parser:(NSXMLParser *)parser didStartElement:(NSString*)elementName namespaceURI:(NSString *)namespaceURI
 
                                                                              qualifiedName:(NSString*)qNameattributes:(NSDictionary *)attributeDict{
 
              //元素开始句柄
 
              if(qName) {
 
                      elementName= qName;
 
              }
 
              if([elementName isEqualToString:@"user"]) {
 
                      //输出属性值
 
                      NSLog(@"Nameis %@ , 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;
 
      [selfparseXMLFileAtURL:[NSURL URLWithString:feedURLString]parseError:&parseError];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值