ASIHTTPRequest登录方法并重用creds

时间:2015-04-03 03:53:18

标签: ios objective-c asihttprequest

我正在使用ASIHTTPRequest登录我的应用程序,并创建了一个bool方法来登录并且运行良好:

-(BOOL)User:(NSString *)user password:(NSString *)password
{
    NSURL *url = [NSURL URLWithString:url];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setUseSessionPersistence:YES];
    [request setUseKeychainPersistence:NO];
    [request setUsername:user];
    [request setPassword:password];
    [request setDomain:domain];
    [request startSynchronous];

    NSError *loginError = [request error];
    if(loginError == nil){
        return true;
    }else{
        return false;
    }

}

但现在我试图在这种方法之外使用这些信用卡。我阅读了文档,看来我可以通过以下方式使用这些信息:

//Should reuse our username and password
request = [ASIHTTPRequest requestWithURL:url];

但是这会引发错误,因为不会定义请求。我该怎么做?

3 个答案:

答案 0 :(得分:1)

仅在方法中request变量的有效范围。您还应该在方法外部定义新变量。

如下所示:

//Should reuse our username and password
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

答案 1 :(得分:0)

作为the documentation says

  

如果启用useSessionPersistence(默认情况下),则ASIHTTPRequest会将凭据存储在内存中,并可以将其重新用于后续请求。

这意味着您的凭据将存储在sessionCredentialsStore(如果您正在使用代理,则sessionProxyCredentialsStore)。除非您覆盖它们,否则它们将自动应用于所有后续请求。这两个变量都是static个全局变量。

因此,只需正常发出请求,只要您不修改凭据存储,凭据就会应用于下一个请求。

答案 2 :(得分:0)

我不是很清楚你在问什么,但据我所知,你关注的是在请求被触发后提取用户凭据。这是对的吗?

我认为这样做的理想方法是永远不要放弃请求(或者只是使用Keychain进行缓存)。因此,基本上将此request变量保存为特定对象的实例变量(ivar)(可能是处理登录任务的单例管理器类型类)。实施例

// LoginManager.h

@import Foundation;

@interface LoginManager : NSObject

@property (nonatomic, readonly, strong) ASIHTTPRequest *request;

@end

// LoginManager.m


#import "LoginManager.h"

@interface LoginManager ()

@property (nonatomic, readwrite, strong) ASIHTTPRequest *request;

@end

@implementation LoginManager

+ (instancetype)sharedManager
{
    static LoginManager *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}

-(BOOL)User:(NSString *)user password:(NSString *)password
{
    NSURL *url = [NSURL URLWithString:url];
    self.request = [ASIHTTPRequest requestWithURL:url];
    [self.request setUseSessionPersistence:YES];
    [self.request setUseKeychainPersistence:NO];
    [self.request setUsername:user];
    [self.request setPassword:password];
    [self.request setDomain:domain];
    [self.request startSynchronous];

    NSError *loginError = [request error];
    if(loginError == nil)
    {
        return true;
    }
    else
    {
        return false;
    }
}

@end

通过以下方式访问:

ASIHTTPRequest *request = [[LoginManager sharedManager] request]

NSLog(@"%@", request.username);
NSLog(@"%@", request.password);