主要記錄關于cookie相關的坑
1. UIWebview
1. UIWebview 相對比較簡單 直接通過 NSHTTPCookieStorage 設定cookie就能實作,
代碼部分
```
NSURL *cookieHost = [NSURL URLWithString:self.domain];
// 設定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[cookieHost host], NSHTTPCookieDomain,
[cookieHost path], NSHTTPCookiePath,
self.cookieKey, NSHTTPCookieName,
self.cookieValue, NSHTTPCookieValue,
nil]];
// 加入cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
```
2. 如果在第一次請求的時候需要在HTTPRequest 通過setValueForKey設定 HeaderValue
2. WKWebview
在使用WKWebview的時候也是需要分兩種情況傳遞:
-
1.HTTPRequest 請求URL的時候攜帶 如后端PHP獲取 cookie
-
2.注入js 目的是讓前端從頁面里邊獲取到cookie 可以通過在document.cookie 設定 通過WKWebview 初始化時候把js傳遞過去
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieValue injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO]; `` -
3.NSHTTPCookieStorage 似乎不攜帶沒問題,因為我們目前沒有通過這個傳遞cookie
網上參考別人的方法是要實作下面幾個步驟,但是我們專案并沒有按照這三種必要方式,但是可以做個參考:
WKWebview三個處理步驟: (1)iOS11,WKHTTPCookieStore 直接傳遞,(如果是只支持iOS11,下面兩步可以不做); (2)iOS8-iOS10, js注入; (3)PHP攜帶cookie方式
相關代碼
#pragma mark - WKWebview
// iOS11
- (void)setWkCookie:(WKWebView *)wkWebview completionHandler:(nullable void (^)(void))comple {
NSURL *cookieHost = [NSURL URLWithString:self.domain];
// 設定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[cookieHost host], NSHTTPCookieDomain,
[cookieHost path], NSHTTPCookiePath,
self.cookieKey, NSHTTPCookieName,
self.cookieValue, NSHTTPCookieValue,
// [NSDate dateWithTimeIntervalSinceNow:30*60*60],NSHTTPCookieExpires,
nil]];
// 加入cookie
//發送請求前插入cookie;
if (@available(iOS 11.0, *)) {
WKHTTPCookieStore *cookieStore = wkWebview.configuration.websiteDataStore.httpCookieStore;
[cookieStore setCookie:cookie completionHandler:^{
comple?comple():nil;
}];
} else {
}
}
// JS攜帶cookie的形式
- (void)setWkJsCookie:(WKUserContentController *)userContentController {
// 單個cookie,多個的話,再加上document.cookie ='%@=%@';一次
NSString *cookieStr = [NSString stringWithFormat:@"document.cookie ='%@=%@';",self.cookieKey,self.cookieValue];
WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
}
// PHP攜帶cookie的形式
- (void)setWkPHPCookie:(NSMutableURLRequest *)request {
//通過host關聯cookie,
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = https://www.cnblogs.com/keyan1102/p/[NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieStorage cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
}
if ([cookieDic objectForKey:[CookieManager shareInstance].cookieKey]) {
[cookieDic removeObjectForKey:[CookieManager shareInstance].cookieKey];
}
// cookie重復,先放到字典進行去重,再進行拼接
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
[cookieValue appendString:[NSString stringWithFormat:@"%@ = %@;",self.cookieKey,self.cookieValue]];
[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];
}
#pragma mark - Webview
// 客戶端添加cookie
- (void)setWebCookie {
NSURL *cookieHost = [NSURL URLWithString:self.domain];
// 設定 cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
[NSDictionary dictionaryWithObjectsAndKeys:
[cookieHost host], NSHTTPCookieDomain,
[cookieHost path], NSHTTPCookiePath,
self.cookieKey, NSHTTPCookieName,
self.cookieValue, NSHTTPCookieValue,
nil]];
// 加入cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
2.WKWebview 有跨域問題
* 最后要說的是以上方法如果 考慮跨域問題的話,UIWebView 是不會出現的,但是WKWebview是不允許跨域的,這個也是蘋果考慮到安全性的方面,但是是可以處理的,目前我們的方案是以下兩種
1.前端通過獲取到cookie后 重新種植一下cookie ,通過 .xxx.com 模糊種植
2.讓后端來處理,可以把用戶相關資訊如 uid傳遞給前端,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/11427.html
標籤:iOS
