一、确认网络环境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=[ReachabilityreachabilityWithHostName:@“www.apple.com”];
- switch([rcurrentReachabilityStatus]){
- caseNotReachable:
- //没有网络连接
- break;
- caseReachableViaWWAN:
- //使用3G网络
- break;
- caseReachableViaWiFi:
- //使用WiFi网络
- break;
- }
3.检查当前网络环境
程序启动时,如果想检测可用的网络环境,可以像这样
- //是否wifi
- +(BOOL)IsEnableWIFI{
- return([[ReachabilityreachabilityForLocalWiFi]currentReachabilityStatus]!=NotReachable);
- }
- //是否3G
- +(BOOL)IsEnable3G{
- return([[ReachabilityreachabilityForInternetConnection]currentReachabilityStatus]!=NotReachable);
- }
- 例子:
- -(void)viewWillAppear:(BOOL)animated{
- if(([ReachabilityreachabilityForInternetConnection].currentReachabilityStatus==NotReachable)&&
- ([ReachabilityreachabilityForLocalWiFi].currentReachabilityStatus==NotReachable)){
- self.navigationItem.hidesBackButton=YES;
- [self.navigationItemsetLeftBarButtonItem:nilanimated:NO];
- }
- }
4、链接状态的实时通知
网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:
Reachability 1.5版本
- //My.AppDelegate.h
- #import"Reachability.h"
- @interfaceMyAppDelegate:NSObject<UIApplicationDelegate>{
- NetworkStatusremoteHostStatus;
- }
- @propertyNetworkStatusremoteHostStatus;
- @end
- //My.AppDelegate.m
- #import"MyAppDelegate.h"
- @implementationMyAppDelegate
- @synthesizeremoteHostStatus;
- //更新网络状态
- -(void)updateStatus{
- self.remoteHostStatus=[[ReachabilitysharedReachability]remoteHostStatus];
- }
- //通知网络状态
- -(void)reachabilityChanged:(NSNotification*)note{
- [selfupdateStatus];
- if(self.remoteHostStatus==NotReachable){
- UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:NSLocalizedString(@"AppName",nil)
- message:NSLocalizedString(@"NotReachable",nil)
- delegate:nilcancelButtonTitle:@"OK"otherButtonTitles:nil];
- [alertshow];
- [alertrelease];
- }
- }
- //程序启动器,启动网络监视
- -(void)applicationDidFinishLaunching:(UIApplication*)application{
- //设置网络检测的站点
- [[ReachabilitysharedReachability]setHostName:@"www.apple.com"];
- [[ReachabilitysharedReachability]setNetworkStatusNotificationsEnabled:YES];
- //设置网络状态变化时的通知函数
- [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(reachabilityChanged:)
- name:@"kNetworkReachabilityChangedNotification"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=[noteobject];
- NSParameterAssert([curReachisKindOfClass:[Reachabilityclass]]);
- NetworkStatusstatus=[curReachcurrentReachabilityStatus];
- if(status==NotReachable){
- UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:@"AppName""
- message:@"NotReachable"
- delegate:nil
- cancelButtonTitle:@"YES"otherButtonTitles:nil];
- [alertshow];
- [alertrelease];
- }
- }
- -(void)applicationDidFinishLaunching:(UIApplication*)application{
- //...
- //监测网络情况
- [[NSNotificationCenterdefaultCenter]addObserver:self
- selector:@selector(reachabilityChanged:)
- name:kReachabilityChangedNotification
- object:nil];
- hostReach=[[ReachabilityreachabilityWithHostName:@"www.google.com"]retain];
- hostReachstartNotifer];
- //...
- }
二、使用NSConnection下载数据
1、创建NSConnection对象,设置委托对象
- NSMutableURLRequest*request=[NSMutableURLRequestrequestWithURL:[NSURLURLWithString:[selfurlString]]];
- [NSURLConnectionconnectionWithRequest:requestdelegate:self];
2、NSURLConnection delegate委托方法
- -(void)connection:(NSURLConnection*)connectiondidReceiveResponse:(NSURLResponse*)response;
- -(void)connection:(NSURLConnection*)connectiondidFailWithError:(NSError*)error;
- -(void)connection:(NSURLConnection*)connectiondidReceiveData:(NSData*)data;
- -(void)connectionDidFinishLoading:(NSURLConnection*)connection;
3. 实现委托方法
- -(void)connection:(NSURLConnection*)connectiondidReceiveResponse:(NSURLResponse*)response{
- //storedata
- [self.receivedDatasetLength:0];//通常在这里先清空接受数据的缓存
- }
- -(void)connection:(NSURLConnection*)connectiondidReceiveData:(NSData*)data{
- [self.receivedDataappendData:data];//可能多次收到数据,把新的数据添加在现有数据最后
- }
- -(void)connection:(NSURLConnection*)connectiondidFailWithError:(NSError*)error{
- //错误处理
- }
- -(void)connectionDidFinishLoading:(NSURLConnection*)connection{
- //disconnect
- [UIApplicationsharedApplication].networkActivityIndicatorVisible=NO;
- NSString*returnString=[[NSStringalloc]initWithData:self.receivedDataencoding:NSUTF8StringEncoding];
- NSLog(returnString);
- [selfurlLoaded:[selfurlString]data:self.receivedData];
- firstTimeDownloaded=YES;
- }
三、使用NSXMLParser解析xml文件
1. 设置委托对象,开始解析
- NSXMLParser*parser=[[NSXMLParseralloc]initWithData:data];//或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:
- //ItsalsopossibletohaveNSXMLParserdownloadthedata,bypassingitaURL,butthisisnotdesirable
- //becauseitgiveslesscontroloverthenetwork,particularlyinrespondingtoconnectionerrors.
- [parsersetDelegate:self];
- [parserparse];
2. 常用的委托方法
- -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementName
- namespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qName
- attributes:(NSDictionary*)attributeDict;
- -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementName
- namespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qName;
- -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string;
- -(void)parser:(NSXMLParser*)parserparseErrorOccurred:(NSError*)parseError;
- staticNSString*feedURLString=@"http://www.yifeiyang.net/test/test.xml";
3. 应用举例
- -(void)parseXMLFileAtURL:(NSURL*)URLparseError:(NSError**)error
- {
- NSXMLParser*parser=[[NSXMLParseralloc]initWithContentsOfURL:URL];
- [parsersetDelegate:self];
- [parsersetShouldProcessNamespaces:NO];
- [parsersetShouldReportNamespacePrefixes:NO];
- [parsersetShouldResolveExternalEntities:NO];
- [parserparse];
- NSError*parseError=[parserparserError];
- if(parseError&&error){
- *error=parseError;
- }
- [parserrelease];
- }
- -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict{
- //元素开始句柄
- if(qName){
- elementName=qName;
- }
- if([elementNameisEqualToString:@"user"]){
- //输出属性值
- NSLog(@"Nameis%@,Ageis%@",[attributeDictobjectForKey:@"name"],[attributeDictobjectForKey:@"age"]);
- }
- }
- -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURI
- qualifiedName:(NSString*)qName
- {
- //元素终了句柄
- if(qName){
- elementName=qName;
- }
- }
- -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string
- {
- //取得元素的text
- }
- NSError*parseError=nil;
- [selfparseXMLFileAtURL:[NSURLURLWithString:feedURLString]parseError:&parseError];