gpt4 book ai didi

ios - objective-c 清除 NSURLCredential - NSURLCredentialPersistenceForSession

转载 作者:技术小花猫 更新时间:2023-10-29 10:51:40 28 4
gpt4 key购买 nike

我在这个方法中使用 NSURLCredentials:

-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler
{


NSURL *url = [NSURL URLWithString:kIP];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
initWithRequest:request];


NSURLCredential *credential = [NSURLCredential
credentialWithUser:user
password:password
persistence:NSURLCredentialPersistenceForSession];

[operation setCredential:credential];

[[NSOperationQueue mainQueue] addOperation:operation];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

if (completionHandler) {
completionHandler(responseObject, nil);
}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

if (completionHandler) {
completionHandler(nil, error);
}

}];

[operation start];
}

现在我希望在注销方法中清除 NSURLCredentials,如下所示:

-(void)logout
{
//Clear NSURLCredentialPersistenceForSession
}

我该怎么做呢?我应该重置 NSURLCredentials 还是应该清除它们?

更新

我找到了这个解决方案:

NSURLCredentialStorage *credentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *credentialsDicationary = [credentialStorage allCredentials];


for (NSURLProtectionSpace *space in [credentialsDicationary allKeys]) {

NSDictionary *spaceDictionary = [credentialsDicationary objectForKey:space];

for (id userName in [spaceDictionary allKeys]) {

NSURLCredential *credential = [spaceDictionary objectForKey:userName];

[credentialStorage removeCredential:credential forProtectionSpace:space];

}

}

来自这里:Using NSURLCredentialPersistenceForSession while request and then clearing the credentials on logout still persist the cerdentials

这是最好的方法吗?我只存储了 1 个凭据。此外,这段代码在这一行给我一个警告:

NSURLCredential *credential = [spaceDictionary objectForKey:userName];

这里是警告...如何删除此警告?

/Users/jsuske/Documents/SSiPad(Device Only)ios7/SchedulingiPadApplication/ViewControllers/LHLoginController.m:496:73: Local declaration of 'userName' hides instance variable

更新

好的,所以我有 3 个方法:UserLogin、Login 和 LogoutButtonPressed

UserLogin:我正在使用 AFNetworking 连接到使用 NSURLCredential 的 Windows 身份验证 URL,如上所示:

-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler
{

NSURL *url = [NSURL URLWithString:kIP];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
initWithRequest:request];

NSURLCredential *credential = [NSURLCredential
credentialWithUser:user
password:password
persistence:NSURLCredentialPersistenceForSession];

[operation setCredential:credential];


[[NSOperationQueue mainQueue] addOperation:operation];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

if (completionHandler) {
completionHandler(responseObject, nil);
}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

if (completionHandler) {
completionHandler(nil, error);
}

}];

[operation start];

}

登录方法正在调用此方法:

- (void)Login
{
NSString *rawString = [self.idTextField text];
NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet];
[self.idTextField setText:[rawString stringByTrimmingCharactersInSet:whitespace]];


[userName UserLogin:self.idTextField.text andPassWordExists:self.passwordTextField.text completionHandler:^(id responseObject, NSError *error) {
if (responseObject) {

[self.idTextField removeFromSuperview];
[self.passwordTextField removeFromSuperview];
[self.loginButton removeFromSuperview];
self.idTextField = nil;
self.passwordTextField = nil;
//self.loginButton = nil;


[self CreateMenu];



[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
indicatorView = nil;
[loadingView removeFromSuperview];
loadingView = nil;
}else{


[self CustomAlert:@"Sorry Login Failed, User and/or Passsword Incorrect"];

[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
indicatorView = nil;
[loadingView removeFromSuperview];
loadingView = nil;

}
}];

}

我正在尝试使用 LogoutButtonPressed 清除我的 session :

- (void)LogoutButtonPressed
{

//@TODO: Fix Logout

NSDictionary *credentialsDict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];

if ([credentialsDict count] > 0) {
NSEnumerator *protectionSpaceEnumerator = [credentialsDict keyEnumerator];
id urlProtectionSpace;

while (urlProtectionSpace = [protectionSpaceEnumerator nextObject]) {
NSEnumerator *userNameEnumerator = [[credentialsDict objectForKey:urlProtectionSpace] keyEnumerator];
id userNameCred;

while (userNameCred = [userNameEnumerator nextObject]) {
NSURLCredential *cred = [[credentialsDict objectForKey:urlProtectionSpace] objectForKey:userNameCred];
NSLog(@"cred to be removed: %@", cred);
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:cred forProtectionSpace:urlProtectionSpace];
}
}
}
}

我从这个例子中得到了这段代码:http://www.springenwerk.com/2008/11/i-am-currently-building-iphone.html

现在我遇到的问题是,当我触发注销按钮然后转到触发没有凭据的登录方法时,我仍然可以登录,如果我注销然后等待 2 - 3 分钟并使用无凭据登录我不能登录。为什么它会这样,它几乎就像信用仍然被保存一样。请帮忙。

更新

我已尝试清除我的 LogoutButtonPressed 中的缓存、cookie 和凭据:

NSURLCache *sharedCache = [NSURLCache sharedURLCache];
[sharedCache removeAllCachedResponses];

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [cookieStorage cookies];
id cookie;
for (cookie in cookies) {
[cookieStorage deleteCookie:cookie];
}

NSDictionary *credentialsDict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials];
if ([credentialsDict count] > 0) {
NSEnumerator *protectionSpaceEnumerator = [credentialsDict keyEnumerator];
id urlProtectionSpace;
while (urlProtectionSpace = [protectionSpaceEnumerator nextObject]) {
NSEnumerator *userNameEnumerator = [[credentialsDict objectForKey:urlProtectionSpace] keyEnumerator];
id userNameCreds;
while (userNameCreds = [userNameEnumerator nextObject]) {
NSURLCredential *cred = [[credentialsDict objectForKey:urlProtectionSpace] objectForKey:userNameCreds];
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:cred forProtectionSpace:urlProtectionSpace];
}
}
}

还是不行。

最佳答案

通过在 URL 末尾添加一个随机数可以轻松解决此问题:

-(void)UserLogin:(NSString *)user andPassWordExists:(NSString *)password completionHandler:(void (^)(NSArray *resultsObject, NSError *error))completionHandler
{
NSInteger randomNumber = arc4random() % 999;

NSString *requestURL = [NSString stringWithFormat:@"%@?cache=%ld",kIP,(long)randomNumber];

NSURL *url = [NSURL URLWithString:requestURL];

NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]
initWithRequest:request];

NSURLCredential *credential = [NSURLCredential
credentialWithUser:user
password:password
persistence:NSURLCredentialPersistenceForSession];


[operation setCredential:credential];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[[NSOperationQueue mainQueue] addOperation:operation];


[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

if (completionHandler) {
completionHandler(responseObject, nil);
}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

if (completionHandler) {
completionHandler(nil, error);
}

}];

[operation start];

}

并确保您调用的所有 URL 末尾都有一个随机数。

关于ios - objective-c 清除 NSURLCredential - NSURLCredentialPersistenceForSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29547134/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com