1

可能这是一个愚蠢的问题,但我想为相同的 url 存储 cookie,但为用户名存储不同的 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];
4

3 回答 3

2

如果我对您的理解正确,您希望为不同的用户设置单独的 cookie 集。如果是这样,那么您应该:

  1. 创建您自己的自定义 cookie 存储类(可能只是一个以基本 URL 为键,cookie 数组作为值的字典),并在其中存储 cookie 以及使用sharedHTTPCookieStorage对象。

  2. 当您更改用户时,擦除共享 cookie 存储并从新用户的 cookie jar 中复制 cookie(或有选择地从共享 jar 中删除该用户创建的每个 cookie)。

如果我误解了您,并且您出于某种原因想要在共享 cookie 存储之外存储一个特定的 cookie:

  1. 使用 nil cookie jar(禁用自动 cookie 存储)基于配置创建 NSURLSession 对象。

  2. 像您在上面所做的那样将 cookie 存储到一个 cookie 罐中(可能是也可能不是共享的 cookie 罐),但要保留那些您想要避免存储的。

  3. 编写一个方法来将该 cookie jar 中的 cookie 添加到 NSURLRequest 对象。

  4. 在使用 URL 请求对象创建任务之前,请始终记住调用该方法。

当然,这一切都假设 NSURLSession。我认为没有办法使用 NSURLConnection 控制 cookie 存储。所有 cookie 都存储在 cookie 罐、句号、AFAIK 中。

于 2016-06-04T04:06:41.197 回答
1

您可以使用sharedCookieStorage(forGroupContainerIdentifier:).

您可以通过使用该方法获得一个通用的 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)
}
于 2018-08-27T17:31:07.690 回答
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
于 2019-03-05T10:53:10.397 回答