我发现我进行REST调用的服务器将cookie传递给我的iPhone。它还使用了HTTP基本认证。
我有一个应用程序,您可以更改用于身份验证的帐户,但是我发现更改凭据并不重要,因为didReceiveAuthenticationChallenge
从未被调用。
我已经研究了两个可能的修复方法:
- 在凭证更改时手动删除cookie
- 设置
[request setHTTPShouldHandleCookies:NO]
我想知道我是否理解正确。我期望NSURLRequestReloadIgnoringCacheData
会照顾缓存,但情况似乎并非如此。
如何解决这个问题?
编辑:我刚刚尝试将shouldHandleCookies
设置为NO
,但似乎cookie仍然传递到服务器。
Rob,你说得很对,这似乎确实有问题。在某些情况下,设置cookie是为了保留旧的认证凭证。其他人建议您可能需要像这样清除cookie,这为我解决了这个问题:
- (void)clearCookiesForURL {
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *cookies = [cookieStorage cookiesForURL:_URL];
for (NSHTTPCookie *cookie in cookies) {
NSLog(@"Deleting cookie for domain: %@", [cookie domain]);
[cookieStorage deleteCookie:cookie];
}
}
看看这个问题了解更多didReceiveAuthenticationChallenge只被调用一次iPhone
Safe Swift:
func clearCookies(forURL URL: NSURL) -> Void {
let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
let cookies = cookieStorage.cookiesForURL(URL) ?? []
for cookie in cookies {
print("Deleting cookie for domain: (cookie.domain)")
cookieStorage.deleteCookie(cookie)
}
}
如果你想接收一个String
,你总是可以flatMap
可失败的NSURL
初始化器:
let cookies = NSURL(string: string).flatMap(cookieStorage.cookiesForURL) ?? []