iOS的Cookie存取(轉(zhuǎn))

當(dāng)前一些公司為了快速出一款app,很多時候采用UINavigationController+WebView或者NavigationController+UITabbarVC+WebView的方式,這樣就不可避免的需要使用cookie與HTML5交互,下面講述幾種常用情景下cookie的添加方法:

一. UIWebView:

// 工廠類中存儲cookie的方法

+ (void)saveCookies {

// 創(chuàng)建一個可變字典存放cookie

NSMutableDictionary *fromappDict = [NSMutableDictionary dictionary];

[fromappDict setObject:@"fromapp" forKey:NSHTTPCookieName];

[fromappDict setObject:@"ios" forKey:NSHTTPCookieValue];

// kDomain是公司app網(wǎng)址

[fromappDict setObject:kDomain forKey:NSHTTPCookieDomain];

[fromappDict setObject:kDomain forKey:NSHTTPCookieOriginURL];

[fromappDict setObject:@"/" forKey:NSHTTPCookiePath];

[fromappDict setObject:@"0" forKey:NSHTTPCookieVersion];

// 將可變字典轉(zhuǎn)化為cookie

NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:params];

// 獲取cookieStorage

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]

// 存儲cookie

[cookieStorage setCookie:cookie];

}

UIWebView使用時間較長,只要在cookieStorage中設(shè)置了相應(yīng)的cookie,每次就會自動帶上;

但是這樣的弊端是隨著與H5的交互增加,Cookie占用的空間越來越大,每次交互都夾帶大量的cookie,不僅增加服務(wù)器端壓力,也浪費(fèi)用戶的流量。比如每次交互都夾帶5kb的cookie內(nèi)容,但是真正用到的只有兩三百字節(jié)。

二. WKWebView

WKWebView相比于UIWebView:

速度快了一倍,內(nèi)存卻減少為原來的一半;

cookie不再是自動攜帶,需要手動設(shè)置;

交互更加順暢,比如app底部四個tabBar也都是網(wǎng)頁的,在UIWebView下點(diǎn)擊,整個H5頁面都會閃白一下,但是在WKWebView下點(diǎn)擊,四個tabBar效果與原生app效果更加類似,不會有閃白現(xiàn)象。

增減了一些代理方法,更方便的進(jìn)行協(xié)議攔截和進(jìn)度條展示

1.在創(chuàng)建的時候存放到WKUserScript中進(jìn)行添加cookie

WKWebViewConfiguration *webConfig = [[WKWebViewConfiguration alloc] init];

// 設(shè)置偏好設(shè)置

webConfig.preferences = [[WKPreferences alloc] init];

// 默認(rèn)為0

webConfig.preferences.minimumFontSize = 10;

// 默認(rèn)認(rèn)為YES

webConfig.preferences.javaScriptEnabled = YES;

// 在iOS上默認(rèn)為NO,表示不能自動通過窗口打開

webConfig.preferences.javaScriptCanOpenWindowsAutomatically = NO;

// web內(nèi)容處理池

webConfig.processPool = [[WKProcessPool alloc] init];

// 將所有cookie以document.cookie = 'key=value';形式進(jìn)行拼接

NSString *cookieValue = [@"document.cookie = 'fromapp=ios';document.cookie = 'channel=appstore';"];

// 加cookie給h5識別,表明在ios端打開該地址

WKUserContentController* userContentController = WKUserContentController.new;

WKUserScript * cookieScript = [[WKUserScript alloc]

initWithSource: cookieValue

injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];

[userContentController addUserScript:cookieScript];

webConfig.userContentController = userContentController;

WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:frame configuration:webConfig];

wkWebView.UIDelegate = wkWebView;

wkWebView.navigationDelegate = wkWebView;

2.加載某個url的時候添加cookie

如果WKWebView在加載url的時候需要添加cookie,需要先手動獲取當(dāng)前NSHTTPCookieStorage中的所有cookie,然后將cookie放到NSMutableURLRequest請求頭中

- (void)loadRequestWithUrlString:(NSString *)urlString {

// 在此處獲取返回的cookie

NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];

NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (NSHTTPCookie *cookie in [cookieJar cookies]) {

[cookieDic setObject:cookie.value forKey:cookie.name];

}

// cookie重復(fù),先放到字典進(jìn)行去重,再進(jìn)行拼接

for (NSString *key in cookieDic) {

NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];

[cookieValue appendString:appendString];

}

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];

[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];

[self loadRequest:request];

}

3.AFNetworking

AFNetworking存取cookie就比較常見了,話不多說,都在代碼里了

// 獲取AFHTTPRequestOperationManager

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];

// 創(chuàng)建可變字典用于存放Cookie

NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];

// 存放新添加的cookie

NSMutableString *cookieValue = [NSMutableString stringWithFormat:@"fromapp=ios;"];

// 獲取

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (NSHTTPCookie *cookie in [cookieJar cookies]) {

[cookieDic setObject:cookie.value forKey:cookie.name];

}

// cookie重復(fù),先放到字典去重,再進(jìn)行拼接

for (NSString *key in cookieDic) {

NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];

[cookieValue appendString:appendString];

}

// 將cookie存到請求頭中

[operationManager.requestSerializer setValue:cookieValue forHTTPHeaderField:@"Cookie"];

//? 拼接url地址

NSString *urlStr = [NSString stringWithFormat:@"%@%@", kHostIP, kPath];

// 設(shè)置參數(shù)字典

NSDictionary *paraDict = @{

@"key" : value

};

// 發(fā)送請求,處理結(jié)果

[operationManager POST:urlStr parameters:paraDict success:^(AFHTTPRequestOperation * _Nonnull operation, id? _Nonnull responseObject) {

NSLog(@"responseObject-->%@", responseObject);

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

NSLog(@"error-->%@", error);

}];

文/si1ence(簡書作者)

原文鏈接:http://www.lxweimin.com/p/d2c478bbcca5

著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,739評論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,634評論 3 419
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,653評論 0 377
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,063評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,835評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,235評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,315評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,459評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,000評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,819評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,004評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,560評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,257評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,676評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,937評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,717評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,003評論 2 374

推薦閱讀更多精彩內(nèi)容