iOS的Cookie存取看我絕對夠!坏逢!

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

一. UIWebView:

// 工廠類中存儲cookie的方法
+ (void)saveCookies {
    // 創(chuàng)建一個(gè)可變字典存放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:fromappDict];

    // 獲取cookieStorage
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]
 
    // 存儲cookie
    [cookieStorage setCookie:cookie];
}
  • UIWebView使用時(shí)間較長,只要在cookieStorage中設(shè)置了相應(yīng)的cookie帘腹,每次就會自動帶上贰盗;
  • 但是這樣的弊端是隨著與H5的交互增加,Cookie占用的空間越來越大阳欲,每次交互都夾帶大量的cookie舵盈,不僅增加服務(wù)器端壓力,也浪費(fèi)用戶的流量球化。比如每次交互都夾帶5kb的cookie內(nèi)容秽晚,但是真正用到的只有兩三百字節(jié)。

二. WKWebView

  • WKWebView相比于UIWebView:

    • 速度快了一倍筒愚,內(nèi)存卻減少為原來的一半赴蝇;
    • cookie不再是自動攜帶,需要手動設(shè)置巢掺;
    • 交互更加順暢句伶,比如app底部四個(gè)tabBar也都是網(wǎng)頁的,在UIWebView下點(diǎn)擊陆淀,整個(gè)H5頁面都會閃白一下考余,但是在WKWebView下點(diǎn)擊,四個(gè)tabBar效果與原生app效果更加類似轧苫,不會有閃白現(xiàn)象楚堤。
    • 增減了一些代理方法,更方便的進(jìn)行協(xié)議攔截和進(jìn)度條展示
  • 1.在創(chuàng)建的時(shí)候存放到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)行拼接
    #warning 然而這里的單引號一定要注意是英文的身冬,不要問我為什么告訴你這個(gè)(手動微笑)
    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.加載某個(gè)url的時(shí)候添加cookie

如果WKWebView在加載url的時(shí)候需要添加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
    #warning 單個(gè)的Cookie還好剿配,但是樓主在工廠類方法中拼接了一個(gè)包含6個(gè)設(shè)備信息的value值搅幅,最后忘記加分號了,測試也沒測出來
    #warning 因?yàn)椴挥绊懝δ芎襞撸呛竺娴腸ookie就自動拼接上了茄唐,H5那邊也識別不到,險(xiǎn)造成重大事故(涉及金融蝇更。沪编。),望后來者看到年扩,提前做好準(zhǔn)備(就憑這個(gè)坑蚁廓,你得給我個(gè)贊)
    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);
    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市况脆,隨后出現(xiàn)的幾起案子饭宾,更是在濱河造成了極大的恐慌,老刑警劉巖格了,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件看铆,死亡現(xiàn)場離奇詭異,居然都是意外死亡盛末,警方通過查閱死者的電腦和手機(jī)弹惦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悄但,“玉大人棠隐,你說我怎么就攤上這事∷隳” “怎么了宵荒?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我报咳,道長侠讯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任暑刃,我火速辦了婚禮厢漩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岩臣。我一直安慰自己溜嗜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布架谎。 她就那樣靜靜地躺著炸宵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谷扣。 梳的紋絲不亂的頭發(fā)上土全,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音会涎,去河邊找鬼裹匙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛末秃,可吹牛的內(nèi)容都是我干的概页。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼练慕,長吁一口氣:“原來是場噩夢啊……” “哼惰匙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贺待,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤徽曲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后麸塞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秃臣,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年哪工,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奥此。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雁比,死狀恐怖稚虎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情偎捎,我是刑警寧澤蠢终,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布序攘,位于F島的核電站,受9級特大地震影響寻拂,放射性物質(zhì)發(fā)生泄漏程奠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一祭钉、第九天 我趴在偏房一處隱蔽的房頂上張望瞄沙。 院中可真熱鬧,春花似錦慌核、人聲如沸距境。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫桂。三九已至,卻和暖如春扒接,著一層夾襖步出監(jiān)牢的瞬間伪货,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工钾怔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒙挑。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓宗侦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忆蚀。 傳聞我的和親對象是個(gè)殘疾皇子矾利,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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