Question

J'ai une application dans laquelle j'ai un formulaire de connexion quel nom d'utilisateur et mot de passe textfields. Lorsque l'utilisateur entre son nom d'utilisateur et son mot de passe et cliquez sur le bouton Soumettre, il ira dans la base de données API du serveur et vérifiera si l'utilisateur est valide ou non. Si la connexion n'est pas, leurs valeurs sont vérifiées dans la base de données SQLite.

Si dans la base de données SQLite Si le nom d'utilisateur et le mot de passe des utilisateurs sont validés, l'utilisateur est autorisé à entrer dans l'application, sinon il devrait s'inscrire. J'ai essayé le code suivant, mais maintenant je suis confus où devrait avoir à mettre mon code.

J'ai vérifié à la fois la connexion du serveur et la connexion SQLite. Ma réponse est que si l'utilisateur se connecte encore et encore, le nom d'utilisateur et le mot de passe doivent toujours vérifier d'abord à partir du serveur non dans la base de données SQLite. Si le serveur est désactivé, le nom d'utilisateur et le mot de passe doivent vérifier à partir de la base de données SQLite.

Ceci est mon code:

[[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];

Le rappel est le suivant;

- (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;

        }
    }
}

Ceci est mon contrôleur API, où je récupére les valeurs de mon serveur API et j'inserte des valeurs dans la base de données SQLite:

//
//  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

C'est une classe où je crée des variables nsstring de mon objet JSON:

//
//  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":"rocky@itg.com","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

Si mon API serveur disponible via NetConnection n'est pas disponible, mes valeurs de nom d'utilisateur et de mot de passe doivent être récupérées et validées à partir de la base de données.

Était-ce utile?

La solution

 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
}

Autres conseils

Tard dans le spectacle ici, mais la meilleure solution pour vérifier cela est avec l'accessibilité. La réception a été écrite par Apple comme "exemple de code", mais est de loin le moyen le plus complet de gérer gracieusement l'état du réseau. Vérifiez Guide de l'accessibilité.

Voici quelques informations concernant la façon d'utiliser l'accessibilité: Guide de l'accessibilité pour iOS 4

J'ai examiné votre question. Je pense que vous devriez suivre ci-dessous le flux:

  1. L'utilisateur entrera «Nom d'utilisateur» et «mot de passe» sous forme de connexion.

  2. Ensuite, vérifiez d'abord la base de données locale.

  3. Si l'utilisateur existe, l'utilisateur peut diriger la connexion et accéder à l'application.

  4. Si l'utilisateur n'existe pas, vérifiez ses informations d'identification à partir du serveur en direct.

  5. Si l'utilisateur est valide, faites l'entrée du nom d'utilisateur et du mot de passe dans la base de données locale. Donc, la prochaine fois, il peut se connecter directement.

  6. Si l'utilisateur n'est pas valide, donnez simplement un message pour l'accès refusé.

Maintenant, pour vérifier la connexion nette: pour cela, prenez une vue Web (la vue Web sera invisible). Puis ouvrez le site Web simple comme "http://www.google.com"Et implémentez également la méthode du délégué de vue Web.

Dans la méthode du délégué de vue Web:

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

    [self connectionFailed:error];
}

Vous trouverez ci-dessous la fonction "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{       
}
}

Ici, ConnectionView View est une autre vue Web. Vous pouvez simplement remplacer le code par uialeview par un message approprié.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top