如何检查网络连接是否可用在iphone

问题描述:

我有一个应用程序,我登录表格中的用户名和密码textfields。当用户输入他/她的用户名和密码,然后点击提交按钮,它会去服务器API数据库,并检查用户是否有效。如果连接不是它们的值在sqlite数据库检查.if在sqlite数据库if用户的用户名和密码进行验证,然后允许用户进入应用程序,否则他将不得不注册。我尝试了下面的代码,但现在我很困惑在哪里应该把我的代码。 我已检查服务器连接和sqlite连接。我的答案是,如果用户一次又一次地登录,那么用户名和密码应该总是先检查服务器而不是在sqlite数据库中。如果服务器关闭,则用户名和密码应该从sqlite数据库检查。 这是我的代码:如何检查网络连接是否可用在iphone

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil]; 

    internetReachable = [[Reachability reachabilityForInternetConnection] retain]; 
    [internetReachable startNotifier]; 

    // check if a pathway to a random host exists 
    hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 
    [hostReachable startNotifier]; 

The callback is as follows; 
- (void) checkNetworkStatus:(NSNotification *)notice 
{ 
    // called after network status changes 

    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    switch (internetStatus) 

    { 
        case NotReachable: 
        { 
            break; 

        } 
        case ReachableViaWiFi: 
        { 
            break; 

        } 
        case ReachableViaWWAN: 
        { 
            break; 

        } 
    } 

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; 
    switch (hostStatus) 

    { 
        case NotReachable: 
        { 
            break; 

        } 
        case ReachableViaWiFi: 
        { 
            break; 

        } 
        case ReachableViaWWAN: 
        { 
            break; 

        } 
    } 
} 


this is my api controller.m where i am fetching values from my api server and inserting values in sqlite database 


// 
// apicontroller.m 
// apitest 
// 
// Created by raji.nair on 6/10/11. 
// Copyright 2011 __MyCompanyName__. All rights reserved. 
// 

#import "apicontroller.h" 
#import "Result.h" 
#import "global.h" 

#import <sqlite3.h> 
#define DATABASE_NAME @"journey.sqlite" 
#define DATABASE_TITLE @"journey" 



@implementation apicontroller 
@synthesize txtUserName; 
@synthesize txtPassword; 
@synthesize txtfirstName; 
@synthesize txtlast; 
@synthesize txtEmail; 
@synthesize webData;  

- (NSString *) getWritableDBPath { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:DATABASE_NAME]; 
} 

-(void)createEditableCopyOfDatabaseIfNeeded 
{ 
    // Testing for existence 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME]; 
    NSLog(@"%@",writableDBPath); 

    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) 
     return; 

    // The writable database does not exist, so copy the default to 
    // the appropriate location. 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] 
           stringByAppendingPathComponent:DATABASE_NAME]; 
    success = [fileManager copyItemAtPath:defaultDBPath 
            toPath:writableDBPath 
            error:&error]; 
    if(!success) 
    { 
     NSAssert1(0,@"Failed to create writable database file with Message : '%@'.", 
        [error localizedDescription]); 
    } 
} 

-(void)sendRequest 
{ 
    UIDevice *device = [UIDevice currentDevice]; 
    NSString *udid = [device uniqueIdentifier]; 
    NSString *sysname = [device systemName]; 
    NSString *sysver = [device systemVersion]; 
    NSString *model = [device model]; 
    NSLog(@"idis:%@",[device uniqueIdentifier]); 
    NSLog(@"system nameis :%@",[device systemName]); 
    NSLog(@"System version is:%@",[device systemVersion]); 
    NSLog(@"System model is:%@",[device model]); 
    NSLog(@"device orientation is:%d",[device orientation]); 
    NSString *post = [NSString stringWithFormat:@"Loginkey=%@&Password=%@&DeviceCode=%@&Firmware=%@&IMEI=%@",txtUserName.text,txtPassword.text,model,sysver,udid]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 
    NSLog(@"%@",postLength); 
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:@"http://192.168.0.68:91/JourneyMapperAPI?RequestType=Login"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 

    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if (theConnection) { 
     webData = [[NSMutableData data] retain]; 
     NSLog(@"%@",webData); 
    } 
    else 
    { 

    } 

} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    [webData setLength: 0]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{   
    [webData appendData:data]; 

} 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{  
    [connection release]; 
    [webData release]; 

} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection 
{  
    NSString *loginStatus = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; 
    NSLog(@"%@",loginStatus); 

    NSString *json_string = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding]; 

    NSDictionary *result = [json_string JSONValue]; 
    NSArray *values = [result objectForKey:@"Result"]; 
    NSMutableArray *results = [[NSMutableArray alloc] init]; 

    for (int index = 0; index<[values count]; index++) { 
     NSMutableDictionary * value = [values objectAtIndex:index]; 
     Result * result = [[Result alloc] init]; 
     result.UserID = [value objectForKey:@"UserId"]; 
     result.FirstName = [value objectForKey:@"FirstName"]; 
     result.LastName =[value objectForKey:@"LastName"]; 
     result.Email =[value objectForKey:@"Email"]; 
     result.ProfileImage =[value objectForKey:@"ProfileImage"]; 
     result.ThumbnailImage =[value objectForKey:@"ThumbnailImage"]; 
     result.DeviceInfoId =[value objectForKey:@"DeviceInfoId"]; 
     NSLog(@"%@",result.UserID); 


     [results addObject:result]; 
     [result release]; 
    } 



    for (int index = 0; index<[results count]; index++) { 
     Result * result = [results objectAtIndex:index]; 
     //save the object variables to database here 


     [self createEditableCopyOfDatabaseIfNeeded]; 

     NSString *filePath = [self getWritableDBPath]; 

     sqlite3 *database; 

     if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
      NSDate *dt = [NSDate date]; //get current date 
      NSString *timestamp = [dt description]; 
      NSString *journeyid = [NSString stringWithFormat:@"%@_%@_%@", result.UserID, result.DeviceInfoId, timestamp]; 

      const char *sqlStatement = "insert into UserInformation(UserID,DeviceId,FirstName,Email,JourneyID) VALUES (?,?,?,?,?)"; 
      sqlite3_stmt *compiledStatement; 
      if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
       sqlite3_bind_text(compiledStatement, 1, [result.UserID UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text(compiledStatement, 2, [result.DeviceInfoId UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text (compiledStatement, 3, [result.FirstName UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text (compiledStatement, 4, [result.Email UTF8String],-1,SQLITE_TRANSIENT); 
       sqlite3_bind_text(compiledStatement, 5, [journeyid UTF8String], -1, SQLITE_TRANSIENT); 

      } 
      if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
       NSLog(@"Save Error: %s", sqlite3_errmsg(database)); 
      } 
      else { 
       UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"UIAlertView" message:@"Record added" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
       [alert show]; 
       [alert release]; 
       alert = nil; 
      } 

      sqlite3_finalize(compiledStatement); 
     } 
     sqlite3_close(database); 
    } 

    [loginStatus release];   
    [connection release]; 
    [webData release]; 
} 

-(IBAction)click:(id)sender 
{ 
    [self sendRequest]; 
} 
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [txtfirstName resignFirstResponder]; 
    [txtlast resignFirstResponder]; 
    [txtUserName resignFirstResponder]; 
    [txtPassword resignFirstResponder]; 
    [txtEmail resignFirstResponder]; 
} 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 


    [super viewDidLoad]; 
    //[self sendRequest]; 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc. that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 


- (void)dealloc { 
    [super dealloc]; 
} 


@end 


this is class where i am creating nsstring variables of my json object 

// 
// Result.h 
// apitest 
// 
// Created by pradeep.yadav on 6/14/11. 
// Copyright 2011 __MyCompanyName__. All rights reserved. 
// 

#import <Foundation/Foundation.h> 


//TokenID":"Vao13gifem","isError":false,"ErrorMessage":"","Result":[{"UserId":"153","FirstName":"Rocky","LastName":"Yadav","Email":"[email protected]","ProfileImage":null,"ThumbnailImage":null,"DeviceInfoId":"12"}],"ErrorCode":900} 
//Terminating in response to SpringBoard's termination. 



@interface Result : NSObject { 

    NSString * UserID; 
    NSString *FirstName; 
    NSString *LastName; 
    NSString *Email; 
    NSString *ProfileImage; 
    NSString *ThumbnailImage; 
    NSString *DeviceInfoId; 
} 
@property (nonatomic,retain) NSString *UserID; 
@property (nonatomic,retain) NSString *FirstName; 
@property (nonatomic,retain) NSString *LastName; 
@property (nonatomic,retain) NSString *Email; 
@property (nonatomic,retain) NSString *ProfileImage; 
@property (nonatomic,retain) NSString *ThumbnailImage; 
@property (nonatomic,retain) NSString *DeviceInfoId; 

@end 



// 
// Result.m 
// apitest 
// 
// Created by pradeep.yadav on 6/14/11. 
// Copyright 2011 __MyCompanyName__. All rights reserved. 
// 

#import "Result.h" 


@implementation Result 
@synthesize UserID; 
@synthesize FirstName; 
@synthesize LastName; 
@synthesize Email; 
@synthesize ProfileImage; 
@synthesize ThumbnailImage; 
@synthesize DeviceInfoId; 





- (void)dealloc { 
    [super dealloc]; 
    [UserID release]; 
    [FirstName release]; 
    [LastName release]; 
    [Email release]; 
    [ProfileImage release]; 
    [ThumbnailImage release]; 
    [DeviceInfoId release]; 
} 


@end 


Please help me in solving this problem that if my server api that is available through netconnection is not available then my username and password values should be fetched and validated from database.Thanks 

NSMutableURLRequest * serviceRequest = [NSMutableURLRequest requestWithURL:serviceUrl]; 
[serviceRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"]; 
[serviceRequest setHTTPMethod:@"POST"]; 
[serviceRequest setHTTPBody:[xmlString dataUsingEncoding:NSUTF8StringEncoding]]; 
NSData *responseData; 
NSURLResponse * serviceResponse; 
NSError * serviceError; 
responseData = [NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&serviceResponse error:&serviceError]; 
NSString *resp=[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
NSLog(@"RETRIEVING:%@",resp); 

if(responseData != NULL) 
{ 
//connection exist 
} 
else 
{ 
//Connection doesn't exist 
} 
+0

嗨@rptwshi,当responseData = NULL应该是什么done.Can你给我出个主意! – Rani 2011-06-17 04:56:56

我查阅了你的问题。我认为你应该遵循以下流程:

1)用户将在登录表单中输入“用户名”和“密码”。

2)然后先检查本地数据库。

3)如果用户存在,则用户可以直接登录并访问应用程序。

4)如果用户不存在,则从实时服务器检查它的凭证。 5)如果用户有效,则输入用户名&密码到本地数据库。所以,下次他可以直接登录。

6)如果用户无效,那么只需提供拒绝访问的消息。

现在,检查网络连接: 为此,采取一个网络视图(网络视图将是不可见的)。然后打开像“http://www.google.com”这样的简单网站,并实施网络查看委托方式。

在web的视图委托方法:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ 

    [self connectionFailed:error]; 
} 
下面

是 “为connectionFailed” 功能:

-(void)connectionFailed:(NSError *)error{ 

if ([error code] == -999) { 
    //show error alert, etc. 
    //NSLog(@"-999 Detected, Do Nothing"); 
    //NSLog([error localizedDescription]); 
} 
else if([error code] == -1009 || [[error localizedDescription] isEqualToString:@"no Internet connection"]){ 
    [self hideLoading]; 
    [connectionView loadHTMLString:@"<body bgcolor=#58637C><br><br><br><br><font size=5 color=white>Please turn on your Internet connection to access this application.</font></body>" baseURL:nil]; 
    [connectionView setFrame:CGRectMake(0.0, 0.0, 320.0, 431.0)]; 
    [self.view addSubview:connectionView]; 
} 
else if([error code] == -1001 || [[error localizedDescription] isEqualToString:@"timed out"]){ 
    [self hideLoading]; 
    [connectionView loadHTMLString:@"<body bgcolor=#58637C><br><br><br><br><font size=5 color=white>Request Timed Out.</font></body>" baseURL:nil]; 
    [connectionView setFrame:CGRectMake(0.0, 0.0, 320.0, 431.0)]; 
    [self.view addSubview:connectionView]; 
} 
else if (error != NULL) { 
    [self hideLoading]; 
    [connectionView loadHTMLString:@"<body bgcolor=#58637C><br><br><br><br><font size=5 color=white>Error loading page, Please try again later.</font></body>" baseURL:nil]; 
    [connectionView setFrame:CGRectMake(0.0, 0.0, 320.0, 431.0)]; 
    [self.view addSubview:connectionView]; 
} 
else{  
} 
} 

这里,connectionView视图是另一个网络图。您可以简单地用UIAlerView用适当的消息替换代码。

希望它会适合你。

如有任何困难,请通知我。

这里的展示已晚,但检查此问题的最佳解决方案是使用可达性。可达性由苹果公司编写为“示例代码”,但是迄今为止,完美处理网络状态的最完整方式。检查出Reachability Guide

下面是关于如何使用可达的一些信息:Reachability Guide for iOS 4