2011-11-27 81 views
0

我得到了以下情况。我正在做一个带有tabbarcontroller和导航控制器的iPhone应用程序。使用该应用程序登录到Web服务器(提供Web服务)以获取会话Cookie后,我单击Tabbarnavigation菜单,向其中一个Web服务发出请求。调用这个web服务,我得到了一个句柄状态代码,告诉我即使该应用程序第一次成功登录到web服务器,也不会登录到服务器。所以我不知道我在做什么错我离开这里我的代码片段。ASIHttprequest登录

的AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [super application:application didFinishLaunchingWithOptions:launchOptions]; 
    [self initTabBarMenu]; 

    return YES; 
}  
// call when the app is not login 
- (void) showLogin 
{ 
    loginViewController = [[LoginViewController alloc] init]; 
    [self.tabBarController presentModalViewController:loginViewController animated:YES]; 
} 

LoginViewController

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *username = [defaults objectForKey:@"usernameApp"]; 
    NSString *password = [defaults objectForKey:@"passwordAp"]; 

    if (![StrUtil isEmpty:username] && ![StrUtil isEmpty:password]) 
    { 
     userField.text = username; 
     passwordField.text = password; 
     [self loginCheck]; 
    } 

} 

- (void) loginCheck 
{ 
    NSString *url = @"http://localhost/service/login"; 

    ASIFormDataRequest *theRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]]; 
    [theRequest setUseKeychainPersistence:YES]; 
    [theRequest setDelegate:self]; 
    [theRequest addPostValue:userField.text forKey:@"username"]; 
    [theRequest addPostValue:passwordField.text forKey:@"password"]; 
    [theRequest setDidFinishSelector:@selector(loginDone:)]; 
    [theRequest setDidFailSelector:@selector(loginFailed:)]; 
    [theRequest startAsynchronous]; 
    [userField resignFirstResponder]; 
    [passwordField resignFirstResponder]; 
} 

- (void) loginResponse:(ASIFormDataRequest *)theRequest 
{ 
    nsData = [[NSDictionary alloc] initWithDictionary:[theRequest.responseString JSONValue]]; 
    [self hideProgress]; 

    if ([[nsData objectForKey:@"status"] integerValue] == 1) 
    { 

     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setObject:userField.text forKey:@"usernameApp"]; 
     [defaults setObject:passwordField.text forKey:@"passwordApp"]; 
     [defaults synchronize]; 
     // Remove current view controller 
     [self.parentViewController dismissModalViewControllerAnimated:YES]; 
    } 
    else 
    { 
     [self showAlert:@"Problem"]; 
    } 
} 

这里的问题是:当我拿到菜单,我不是正从我的web服务的任何数据,实际应用甚而不尝试调用它,我使用BaseController从那里调用每一个webservice,所以我得到了从BaseController扩展的HomeViewController,所以我得到了一个通用的方法来调用我的BaseController上的webservice,如下所示:

- (void) callRequest 
{ 
    //url is a NSString and you can set on HomeviewController 
    if ([StrUtils isEmpty:url]) return; 
    request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; 
    //[request setDownloadCache:[ASIDownloadCache sharedCache]]; 
    [request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy]; 
    [request setSecondsToCache:60*60*24*7]; // Cache for 7 days 
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; 

    [request setDelegate:self]; 
    [request setResponseEncoding:NSUTF8StringEncoding]; 
    [request setDefaultResponseEncoding:NSUTF8StringEncoding]; 
    [request setDidFinishSelector:@selector(requestFinished:)]; 
    [request setDidFailSelector:@selector(finishedWithError:)]; 
    [request setTimeOutSeconds:15]; 
    [request startAsynchronous]; 
} 

- (void) requestFinished:(ASIHTTPRequest*)theRequest 
{ 
    NSString *responseString = [theRequest responseString]; 
    nsData = [[NSDictionary alloc] initWithDictionary:[responseString JSONValue]]; 

    if ([[receivedData objectForKey:@"status"] integerValue] == 1) 
    { 
     return [(AppDelegate *)[[UIApplication sharedApplication] delegate] showLogin]; 
    } 
} 

然后,我从viewDidLoad中

调用WebService的
- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self callRequest]; 

} 

HomeViewController

- (id) init 
{ 
    if ((self = [super init])) 
    { 
     self.title = @"My Home"; 
     self.url = @"http://localhost/services/gethome" 
    } 

    return self; 
} 

因此,在总结,问题是:我不能得到任何数据从我tabbarnavigation任何部分。我第一次点击1项,它加载loginviewcontroller(即使登录以前是成功的),然后再次调用web服务登录。直接在第二次登录后,我无法获得任何数据。

嗯,我不知道我能做什么,谢谢你的所有建议和答案。

回答

0

您的问题可能是您没有接受您的登录请求中的Cookie。测试以查看您的Cookie在登录电话后的价值。