WKWebView Cookie管理與資源自定義

weixin_33895657發表於2017-09-08
1433026-a4deb3c7c29a267c.jpeg
WebKit.jpeg

為什麼要用WKWebview?

  • 獨立程式與APP程式相互隔離,與app同時執行,效能優勢
  • 網頁不用內容可以在不同網頁程式獨立執行,防止惡意網頁攻擊,更加安全
  • 與Safari 同樣的 JavaScript 引擎, html 5 支援更好
  • 記憶體佔用低

由於 iOS11 之前版本都存在 cookie 無法共享,網址無法攔截,資源不能自定義等問題。現在 iOS 11 來了,解決了這些問題,而且蘋果不斷對它進行優化,替代UIWebview也指日可待。

cookie 管理

什麼是cookie?

網路請求中包含一小段資料(4K限制),就是cookie,用於追蹤使用者行為。

WKHTTPCookieStore

由於 WKWebview是獨立程式的,所以,Cookies也是獨立的,雖然可以通過JS的方法來獲取cookie。但是跨站點cookie和 HTTP-only cookies卻無能為力,這個時候就需要一套類似與NSHTTPCookieStore的管理工具。iOS 11中提供了這麼一個類-WKHTTPCookieStore。

  • addObserver
  • removeObserver
  • setCookie
  • getAllCookie
  • deleteCookie

demo


    WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
        
    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{
                                                                    NSHTTPCookieDomain:@".baidu.com",
                                                                    NSHTTPCookieName:@"s",
                                                                    NSHTTPCookieValue:@"s1",
                                                                    NSHTTPCookiePath:@"/",
                                                                    NSHTTPCookieSecure:[NSNumber numberWithBool:YES]
                                                                    }];
        
    [cookieStore setCookie:cookie completionHandler:^{
            
        }];

由於cookie設定不就是一個同步的操作, 需要等待它的完成。通過這種方式可以將NSHTTPCookieStore中的cookies設定到WKHTTPCookieStore中。

過濾不需要的內容 - WKContentRuleList

請求之前,對請求內容進行過濾,只需要通過json的簡單配置即可實現。

demo

NSString *jsonString = @"[{\"trigger\": {\"url-filter\": \".*\"}, \"action\": { \"type\":\"make-https\" }}]";
    
[WKContentRuleListStore.defaultStore compileContentRuleListForIdentifier:@"ContentBlockRules" encodedContentRuleList:jsonString completionHandler:^(WKContentRuleList *ruleList, NSError *error) {
        
        if (error) {
            
            return;
        }
        
    }];
    

注意 encodedContentRuleList 的規則 在這裡可以找到。上面例子的規則是實現了一個將http轉換為https的請求,保證程式的安全性。

自定義資源的能力 - WKURLSchemeHandler

我們會有一些資源來源於本地,需要通過一種方式很好的處理與web之間的關係。iOS 11 提供的方法是 WKURLSchemeHandler ,通過註冊scheme,來處理本地資料,再將資料返回給web。

demo

WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
        
[config setURLSchemeHandler:[[SchemeHandler alloc] init] forURLScheme:@"apple-local"];
        
NSURL *url = [NSURL URLWithString:@"apple-local://www.baidu.com"];

- (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask
{
    UIImage *image = [UIImage imageNamed:@"photo"];
    NSData *data =  UIImageJPEGRepresentation(image, 1.0);
    
    [urlSchemeTask didReceiveResponse:[[NSURLResponse alloc] initWithURL:urlSchemeTask.request.URL MIMEType:@"image/jpg" expectedContentLength:data.length textEncodingName:nil]];

    [urlSchemeTask didReceiveData:data];

    [urlSchemeTask didFinish];
}

- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask;
{
    urlSchemeTask = nil;
}

以上是一些基本用法,上傳一個demo

相關文章