一:确认网络环境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];
二:使用NSConnection下载数据
三:使用NSXMLParser解析xml文件