可能这是一个愚蠢的问题,但我想为同一个网址存储Cookie,但用户名不同。如何使用NSHTTPCookieStorage实现这一目标?这就是我如何存储响应中的cookie。
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSDictionary *headerFields = [httpResponse allHeaderFields];
NSArray* cookies = [NSHTTPCookie
cookiesWithResponseHeaderFields:headerFields
forURL:[NSURL URLWithString:@""]];
for (NSHTTPCookie *cookie in cookies) {
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
NSString *urlString = ...;
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[NSURL URLWithString:urlString] mainDocumentURL:nil];
答案 0 :(得分:2)
如果我理解正确,您希望为不同的用户提供单独的Cookie集。如果是这样,那么你应该:
创建您自己的自定义Cookie存储类(可能只是一个以基本URL作为键和一组Cookie作为值的字典),并在此处存储Cookie以及使用sharedHTTPCookieStorage
对象。
当您更改用户时,擦除共享cookie存储并从新用户的cookie jar中复制cookie(或有选择地从共享jar中删除该用户创建的每个cookie)。
如果我误解了你,你想出于某种原因在共享cookie存储之外存储一个特定的cookie:
根据带有nil cookie jar的配置创建NSURLSession对象(禁用自动cookie存储)。
将饼干存放在像上面那样的饼干罐中(可能是也可能不是共享的饼干罐),但要省去你想要避免存放的饼干。
编写一种方法,将该cookie罐中的cookie添加到NSURLRequest对象中。
在使用URL请求对象创建任务之前,请务必记住该方法。
当然,这都假定为NSURLSession。我不认为有办法用NSURLConnection控制cookie存储。所有cookie都存储在cookie jar,期间,AFAIK中。
答案 1 :(得分:0)
您可以使用sharedCookieStorage(forGroupContainerIdentifier:)
为同一URL设置单独的Cookie存储(即多个用户)。
您可以使用该方法获得公用Cookie存储,并将其用于URLSession
。
NSHTTPCookieStorage用于相同的URL,但用户不同
let configuration = URLSessionConfiguration.default.copy() as! URLSessionConfiguration
configuration.httpCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: UUID().uuidString)
configuration.httpCookieStorage?.cookieAcceptPolicy = .always
let sessionForCurrentUser = URLSession(configuration: configuration)
let task = sessionForCurrentUser.dataTask(with: URL(string: "https://foo.com/feature")!)
// ...
因此,如果要支持多个用户,请为每个用户创建一个公共组标识符。
如果应用程序以访客用户身份启动,那么当用户登录时,您需要“升级” Cookie存储。
// Upgrade from Guest user to Paid user
let guestCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: guestId)
let userCookieStorage = HTTPCookieStorage.sharedCookieStorage(forGroupContainerIdentifier: user.uniqueIdentifier)
for cookie in guestCookieStorage.cookies ?? [] {
userCookieStorage.setCookie(cookie)
}
答案 2 :(得分:0)
@interface NSHTTPCookieStorage (ApplePrivateHeader)
-(id)_initWithIdentifier:(id)arg1 private:(BOOL)arg2;
@end
@interface User()
@property (nonatomic, strong) NSHTTPCookieStorage *myHTTPCookieStorage;
@end
@implementation User
-(instancetype)init
{
self = [super init];
if (self) {
//the [NSHTTPCookieStorage init] will generate a instance with no inner `NSHTTPCookieStorageInternal`, so.
_myHTTPCookieStorage = [[NSHTTPCookieStorage alloc] _initWithIdentifier: @"user_id_xxx" private:0];
_myHTTPCookieStorage.cookieAcceptPolicy = NSHTTPCookieAcceptPolicyAlways;
}
return self;
}
-(void)httpTask{
NSURLSessionConfiguration *c =[NSURLSessionConfiguration ephemeralSessionConfiguration];
c.HTTPCookieStorage = _myHTTPCookieStorage;
[[[NSURLSession sessionWithConfiguration: c] dataTaskWithRequest:request completionHandler:nil] resume];
}
// load from file
-(void)(id)initWithCoder:(NSCoder *)aDecoder{
NSArray<NSHTTPCookie*> *cookies = [aDecoder decodeObjectForKey:@"cookies"];
for (NSHTTPCookie *cookie in cookies) {
[_myHTTPCookieStorage setCookie: cookie];
}
}
//save to file
- (void)encodeWithCoder:(NSCoder *)aCoder
[aCoder encodeObject:_myHTTPCookieStorage.cookies forKey: @"cookies"];
}
@end