Frage

Ich habe eine Anwendung, in der ich ein Anmeldeformular habe, das den Benutzernamen und das Passwort textfields enthält. Wenn der Benutzer seinen Benutzernamen und sein Kennwort eingibt und auf die Schaltfläche "Senden" klickt, wird die Server-API-Datenbank aufgerufen und überprüft, ob der Benutzer gültig ist oder nicht. Wenn die Verbindung nicht hergestellt ist, werden ihre Werte in der SQLite-Datenbank überprüft.

Wenn in der SQLite-Datenbank Benutzername und Kennwort des Benutzers überprüft werden, darf der Benutzer in die Anwendung eintreten, andernfalls müsste er sich registrieren. Ich habe den folgenden Code ausprobiert, bin aber jetzt verwirrt, wo ich meinen Code ablegen muss.

Ich habe sowohl die Serververbindung als auch die SQLite-Verbindung überprüft. Meine Antwort lautet: Wenn sich Benutzer immer wieder anmelden, sollten Benutzername und Kennwort immer zuerst vom Server überprüft werden, der sich nicht in der SQLite-Datenbank befindet. Wenn der Server ausgeschaltet ist, sollten Benutzername und Kennwort aus der SQLite-Datenbank überprüft werden.

Dies ist mein 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];

Der Rückruf lautet wie folgt:

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

        }
    }
}

Dies ist mein API-Controller, auf dem ich Werte von meinem API-Server abrufe und Werte in die SQLite-Datenbank einfüge:

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

Dies ist eine Klasse, in der ich nsstring-Variablen meines json-Objekts erstelle:

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

Wenn meine über netconnection verfügbare Server-API nicht verfügbar ist, sollten meine Werte für Benutzername und Kennwort aus der Datenbank abgerufen und überprüft werden.

War es hilfreich?

Lösung

 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
}

Andere Tipps

Spät zur Show hier, aber die beste Lösung, um dies zu überprüfen, ist die Erreichbarkeit.Die Erreichbarkeit wurde von Apple als "Beispielcode" geschrieben, ist jedoch bei weitem die vollständigste Methode, um den Netzwerkstatus ordnungsgemäß zu handhaben.Lesen Sie den Reachability Guide .

Hier einige Informationen zur Verwendung der Erreichbarkeit: Erreichbarkeitshandbuch für iOS 4

Ich habe Ihre Frage überprüft. Ich denke, Sie sollten dem folgenden Ablauf folgen:

  1. Der Benutzer gibt "Benutzername" und "Passwort" in das Anmeldeformular ein.

  2. Dann zuerst in der lokalen Datenbank einchecken.

  3. Wenn ein Benutzer vorhanden ist, kann er sich direkt anmelden und auf die App zugreifen.

  4. Wenn der Benutzer nicht vorhanden ist, überprüfen Sie seine Anmeldeinformationen vom Live-Server.

  5. Wenn der Benutzer gültig ist, geben Sie Benutzername und Passwort in die lokale Datenbank ein. Damit er sich das nächste Mal direkt anmelden kann.

  6. Wenn der Benutzer nicht gültig ist, geben Sie einfach eine Nachricht für den verweigerten Zugriff.

    Nun zur Überprüfung der Netzverbindung: Nehmen Sie dazu eine Webansicht (die Webansicht ist unsichtbar). Öffnen Sie dann eine einfache Website wie " http://www.google.com " und implementieren Sie die Delegierungsmethode für die Webansicht .

    in der Webansicht-Delegatenmethode:

    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
    
        [self connectionFailed:error];
    }
    

    unten ist die Funktion "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{       
    }
    }
    

    Hier ist die ConnectionView-Ansicht eine andere Webansicht. Sie können den Code einfach durch UIAlerView mit der richtigen Nachricht ersetzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top