我有一个要求。我正在使用应用程序中的登录屏幕。除非用户有意识地注销,否则应用程序甚至不应在用户登录后显示登录屏幕。
我是Objective-C
的新手。任何人都可以帮我这样做。
先谢谢。
这是我的登录按钮代码。我不知道该怎么做..
- (IBAction)LoginButton:(id)sender
{
@try
{
email = emailTextField.text;
password=passwordTextField.text;
NSLog(@"The email %@ and Password is %@ " , emailTextField.text,passwordTextField.text);
if ([ emailTextField.text isEqualToString:@""] || [passwordTextField.text isEqualToString:@""] )
{
UIAlertView *LoginAlert=[[UIAlertView alloc]initWithTitle:@"Fields Empty" message:@"Please Enter the your creadentials" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[LoginAlert show];
}
else
{
NSString *urlString =[NSString stringWithFormat:@"{\"Email\":\"%@\",\"Password\":\"%@\"}",emailTextField.text,passwordTextField.text];
NSLog(@"the post url %@",urlString);
NSString *post = urlString;
NSString *url=[NSString stringWithFormat:@"http://"];
NSLog(@"The whole url %@ ", url);
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
NSString *authStr = [NSString stringWithFormat:@"%@:%@", @"", @""];
NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedStringWithOptions:0]];
NSLog(@"%@",authValue);
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSError *error;
NSHTTPURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
id json = [NSJSONSerialization JSONObjectWithData:urlData options:0 error:nil];
NSLog(@"json %@ ", json);
if ([[json valueForKey:@"Status"] isEqualToString:@"Sucess"])
{
NSString *LoggedPersonID =[json valueForKey:@"PersonID"];
NSLog(@"the logged person ID is %@", LoggedPersonID);
[[NSUserDefaults standardUserDefaults] setObject:LoggedPersonID forKey:@"PersonIDUserDefaults"];
[[NSUserDefaults standardUserDefaults] synchronize];
//[self performSegueWithIdentifier:@"LoginSeque" sender:self];
[self CalculateWeekTwo];
if (_SecondJsonData != nil)
{
[self MyNotificationMethod];
[self performSegueWithIdentifier:@"LoginSeque" sender:self];
}
else
{
UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Error in Connection" message:@"Please check your network connectivity" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
}
}
else if ([[json valueForKey:@"Status"] isEqualToString:@"Error"] || json == nil)
{
UIAlertView *LoginAlert=[[UIAlertView alloc]initWithTitle:@"Login Failed" message:@"Please make sure you have entered the correct details" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[LoginAlert show];
}
}
//[[NSUserDefaults standardUserDefaults] setObject:@"10940" forKey:@"PersonIDUserDefaults"];
[[NSUserDefaults standardUserDefaults] synchronize];
//emailTextField.text=9416;
}
@catch (NSException *exception)
{
NSLog(@"exception %@", exception);
UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Network Error" message:@"Please try later" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
}
@finally {
NSLog(@"what do i do here");
}
//[self performSegueWithIdentifier:@"LoginSeque" sender:self];
}
答案 0 :(得分:0)
- (IBAction)LoginButton:(id)sender
{
if ([[json valueForKey:@"Status"] isEqualToString:@"Sucess"])
{
// Navigate to login view controller
}
else
{
// Throw error alert
}
}
答案 1 :(得分:0)
在我的项目中,我通过使用 NSCoding 实现了这一目标。一旦用户登录,他将保持登录状态,直到他退出并绕过登录屏幕。
为此,我在模型类中使用了两种方法:
- (void) encodeWithCoder : (NSCoder *)encode ;
- (id) initWithCoder : (NSCoder *)decode;
- (void)encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:_strDOB forKey:@"dob"];
[encoder encodeObject:_strEmail forKey:@"email"];
[encoder encodeObject:_strSName forKey:@"surname"];
}
- (id)initWithCoder:(NSCoder *)decoder{
if((self = [super init])){
_strDOB = [decoder decodeObjectForKey:@"dob"];
_strEmail = [decoder decodeObjectForKey:@"email"];
_strSName = [decoder decodeObjectForKey:@"surname"];
}
return self;
}
比你的loginView.m:
- (void)saveObject:(Cls *)Obj key:(NSString *)key{
NSData *encodeObject = [NSKeyedArchiver archivedDataWithRootObject:Obj];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:encodeObject forKey:key];
[defaults synchronize];
}
- (Cls *)loadObjectWithKey:(NSString *)key{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *encodedObject = [defaults objectForKey:key];
Cls *Obj = [NSKeyedUnarchiver unarchiveObjectWithData:encodedObject];
return Obj;
}
最后在使用
的登录按钮方法中- (void)saveObject:(Cls *)Obj key:(NSString *)key;
您可以保存登录凭据的方法。
在viewWillAppear方法中,您需要调用
- (Cls *)loadObjectWithKey:(NSString *)key;
使用NSUserDefault加载对象的方法。
这肯定会对我有用。 希望它有所帮助。
答案 2 :(得分:0)
使用NSUserDefault修改你的代码。
[[NSUserDefaults standardUserDefaults] setObject:LoggedPersonID forKey:@"PersonIDUserDefaults"];//after this line add the below code
[[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"isLogIn"];//add this line in your given code
[[NSUserDefaults standardUserDefaults] synchronize];
现在,您可以在应用程序委托中添加以下代码,如果登录是第一个屏幕,或者您在哪里呼叫登录屏幕。
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
if ([[defaults valueForKey:@"isLogIn"]isEqualToString:@"YES"]) {
//already login
//also you can access your LoggedPersonID here
}
else{
//call the login view here
}
您也可以在不添加此isLogIn参数的情况下进行管理。
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
if ([defaults valueForKey:@"PersonIDUserDefaults"]==nil) {
//call the login view here
}
else{
//logged in
}