iOS APP中后臺(tái)無法種植Cookie?

我們都知道Cookie Policy會(huì)影響服務(wù)器能否在客戶端(iOS設(shè)備中)種cookie

iOS系統(tǒng)中通過NSHTTPCookieStorage類的單例來管理Cookie Policy, 并且有以下幾中Cookie Policy:

  • NSHTTPCookieAcceptPolicyAlways --- Accept all cookies.
  • NSHTTPCookieAcceptPolicyNever --- Reject all cookies.
  • NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain --- Accept cookies only from the main document domain.

雖然Apple官方文檔中表示NSHTTPCookieAcceptPolicyAlways(This is the default cookie accept policy.)是默認(rèn)的配置, 但是我們實(shí)際在一個(gè)全新的BunldeID的App中,打印看到的初始配置是NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain, 代碼結(jié)構(gòu)如下:

-(NSString *)plicyNameBy:(NSHTTPCookieAcceptPolicy)plicy{
    NSString *ret = nil;
    switch (plicy) {
        case NSHTTPCookieAcceptPolicyAlways:
            return @"NSHTTPCookieAcceptPolicyAlways";
            break;
        case NSHTTPCookieAcceptPolicyNever:
            return @"NSHTTPCookieAcceptPolicyNever";
            break;
        case NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:
            return @"NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain";
            break;
    }
    return ret;
}

-(void)printPolicy{
    NSHTTPCookieAcceptPolicy policy = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookieAcceptPolicy;
    NSLog(@"當(dāng)前cookie storage 策略: %@",[self plicyNameBy:policy]);
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self printPolicy]; // 打印結(jié)果是 NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain

    return YES;
}

1. Cookie Policy的正常情況

在測(cè)試之前, 首先需要將APP從iPhone上刪除以后, 運(yùn)行如下代碼:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self printPolicy];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
    [self printPolicy];

    return YES;
}

輸出結(jié)果如下

2018-11-14 16:12:25.194597+0800 CookiePolicyDemo[72266:4789124] 當(dāng)前cookie storage 策略: NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
2018-11-14 16:12:25.195228+0800 CookiePolicyDemo[72266:4789124] DiskCookieStorage changing policy from 2 to 1, cookie file: file:///private/var/mobile/Containers/Data/Application/142771D7-0798-45F6-86B3-5EEF3921672C/Library/Cookies/Cookies.binarycookies
2018-11-14 16:12:25.195274+0800 CookiePolicyDemo[72266:4789124] 當(dāng)前cookie storage 策略: NSHTTPCookieAcceptPolicyNever

此時(shí), 不要?jiǎng)h除APP, 將設(shè)置Policy那句語句注釋掉,直接重新編譯Run起APP, 代碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self printPolicy];
//    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
    [self printPolicy];

    return YES;
}

結(jié)果如下:

2018-11-14 16:15:53.618973+0800 CookiePolicyDemo[72283:4789890] 當(dāng)前cookie storage 策略: NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain
2018-11-14 16:15:53.619013+0800 CookiePolicyDemo[72283:4789890] 當(dāng)前cookie storage 策略: NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain

我們可以看出, Cookie Policy 恢復(fù)成NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain. 這種情況是我們認(rèn)可的正常情況.

2. Cookie Policy的異常情況!!!

  1. 將手機(jī)上的APP刪掉!!!!!!!
  2. 將Cookie Storage策略設(shè)置成Never, 然后Run:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self printPolicy];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
    [self printPolicy];

    return YES;
}
// 此時(shí)結(jié)果會(huì)正常打印, 和上一節(jié)內(nèi)容一樣
  1. 當(dāng)APP進(jìn)入手機(jī)界面以后, 快速點(diǎn)擊Home,讓APP進(jìn)入后臺(tái). (或者在手機(jī)上雙擊home, 直接關(guān)閉APP)
  2. 在Xcode中將[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];語句注釋掉:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self printPolicy];
//    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever];
    [self printPolicy];
    return YES;
}
  1. 此時(shí)上一次配置Never的APP還在設(shè)備上運(yùn)行, 在注釋上面代碼以后, 直接按Xcode的Run. APP會(huì)再次啟動(dòng),打印的Cookie Policy居然是:
2018-11-14 16:30:25.452648+0800 CookiePolicyDemo[72375:4794345] 當(dāng)前cookie storage 策略: NSHTTPCookieAcceptPolicyNever
2018-11-14 16:30:25.452683+0800 CookiePolicyDemo[72375:4794345] 當(dāng)前cookie storage 策略: NSHTTPCookieAcceptPolicyNever
  1. 此時(shí), 只要我們沒有主動(dòng)將APP沒有刪除, 同時(shí)在新的代碼中沒有主動(dòng)調(diào)用[NSHTTPCookieStorage +setCookieAcceptPolicy:]方法去設(shè)置Cookie Policy, 那么此APP就永遠(yuǎn)不能被后臺(tái)種植Cookie了!!!!!因?yàn)榇藭r(shí), 我們的Cookie Policy 永遠(yuǎn)是NSHTTPCookieAcceptPolicyNever!!!!!

按常理, 我們?cè)谧⑨尩?code>[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever]以后, 系統(tǒng)的 Cookie Policy 會(huì)修改成默認(rèn)的NSHTTPCookieAcceptPolicyAlways或者NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain, 但是這里的結(jié)果缺與我們直觀感受有所出入!!!

總結(jié)

這個(gè)問題讓我們認(rèn)識(shí)到, iOS系統(tǒng)中的Cookie Storage Policy 可能用的一個(gè)外部文件存儲(chǔ)相關(guān)配置, 只要我們手動(dòng)調(diào)用過[NSHTTPCookieStorage +setCookieAcceptPolicy:]方法, 那么該配置就會(huì)被寫入該外部文件.

也就是說, 只要以下3個(gè)條件同時(shí)滿足, 原app相關(guān)的外部配置依然會(huì)生效!!!:

  1. 我們調(diào)用過+setCookieAcceptPolicy, 并且將該APP安裝到的iOS設(shè)備
  2. 在該APP運(yùn)行情況時(shí), 有異常情況發(fā)生(APP進(jìn)入后臺(tái),APP被手動(dòng)終止)
  3. 將調(diào)用過+setCookieAcceptPolicy注釋以后的APP, 重新安裝在該設(shè)備上, 重用原APP的資源.

解決該問題只能, 通過代碼將Cookie Storage設(shè)置成NSHTTPCookieAcceptPolicyAlways或者NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain.

在SDK開發(fā)過程中, 要防止殼APP對(duì) Cookie Sotrage 的配置影響SDK內(nèi)部的Cookie相關(guān)內(nèi)容, 還是建議手動(dòng)存儲(chǔ)后臺(tái)在 Response 中的Set-Cookie中的Cookie, 而不要使用系統(tǒng)層的Cookie存儲(chǔ)邏輯.

ps: 以上內(nèi)容中, 我只使用Xcode - Run 來表示重裝APP, 實(shí)際情況中可能, 用戶在進(jìn)入我們APP以后, 進(jìn)入app store更新我們的app,會(huì)導(dǎo)致原打開的app進(jìn)入后臺(tái)!!!!! 滿足上面提到的3個(gè)條件

參考

  1. 關(guān)于ios的Cookie那些事
  2. iOS htttp網(wǎng)絡(luò)請(qǐng)求cookie的讀取與寫入(NSHTTPCookieStorage)
  3. NSMutableURLRequest 設(shè)置cookie 及 NSHTTPCookieStorage機(jī)制
  4. iOS開發(fā)WKWebView Cookie的讀取與寫入,與UIWebView的Cookie共享
  5. What is the default cookieAcceptPolicy
  6. Apple Doc
  7. Understanding iOS Cookie Accept Policy
  8. React Native持久化sessions #9
  9. Does NSURLConnection automatically persist cookies sent from server?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • cookie機(jī)制采用的是在客戶端保持 HTTP 狀態(tài)信息的方案 Cookie是在瀏覽器訪問WEB服務(wù)器的某個(gè)資源時(shí)...
    葛高召閱讀 3,142評(píng)論 0 0
  • iOS App開發(fā)中的Cookie 一、何為Cookie Cookie是網(wǎng)站為了便是終端身份,保存在終端本地的用戶...
    o本是后山人o偶作前堂客o閱讀 3,991評(píng)論 1 8
  • 什么是Cookie Cookie,有時(shí)也用其復(fù)數(shù)形式 Cookies,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行 sessi...
    Longshihua閱讀 5,317評(píng)論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,699評(píng)論 19 139
  • 孩子已經(jīng)停止了哭泣, 好像大海突然沒有了風(fēng)波, 我受驚的心,從來沒有這樣, 平靜, 幸好沒有人來打擾,倘若友好的世...
    花滿柵攔閱讀 118評(píng)論 0 0

友情鏈接更多精彩內(nèi)容