网络编程
网络编程
【澳门唯一授权dc5566官网】NSUEnclaveLProtocol全计谋
网络编程 2020-01-03 08:32

思路: 使用NSU奇骏LProtocol拦截央求转载到地头。

title: NSU悍马H2LProtocol 全战术author: 全凯description: NSU传祺LProtocol是U揽胜L Loading System的基本点组成都部队分,具有非常刚劲的效应,本文周详介绍了NSUHavalLProtocol的漫天。categories: iOSdate: 2017/02/15tags:

导语

1.认可离线化必要

  • iOS
  • 网络

WKWebView 是苹果在 WWDC 二〇一六 上盛产的新一代 webView 组件,用以代表 UIKit中笨重难用、内部存款和储蓄器泄漏的 UIWebView。WKWebView具有60fps滚动刷新率、和 safari 相似的 JavaScript 引擎等优势。

单位负责的app有局地利用的线上h5页,长期以来加载略慢...

一个人资深的iOS大神Mattt 汤普森在【澳门唯一授权dc5566官网】NSUEnclaveLProtocol全计谋。 博客里说过,说“NSUENCORELProtocol is both the most obscure and the most powerful part of the U奥迪Q5L Loading System.”NSUENCORELProtocol是UOdysseyL Loading System中效果最有力也是最晦涩的局地。

粗略的适配方法本文不再赘述,重要来讲说适配 WKWebView 进度中填过的坑以至善待解决的本领难点。

于是乎思索选择离线化加载。

那句话给了NSURAV4LProtocol三个相当标准的意志。NSU传祺LProtocol作为U奥迪Q3L Loading System中的一个独自部分存在,能够阻挡全体的UWranglerL Loading System发出的网络供给,拦截之后便可依附需求做各类自定义管理,是iOS网络层实现AOP的终极利器,所以成效和影响力都以可怜强盛的。但是至于NSUHavalLProtocol的文书档案少之甚少,文书档案陈旧,富含苹果官方的文档也介绍得比较轻巧。何况,对于NSUEnclaveLProtocol的应用,有坑的地点比相当多。所以说它也是猛烈的还要是人命关天的。

1、WKWebView 白屏难题

确保[低速网络]或[无网络]可网页秒开。

NSUEscortLProtocol是URAV4L Loading System的根本组成部分。首先即使可以称作NSU奥迪Q7LProtocol,但它却不是协商。它是一个抽象类。我们要动用它的时候需求创造它的多个子类。NSUTiguanLProtocol在iOS系统中山高校约处于那样三个职位:

WKWebView 自诩具有越来越快的加载速度,更低的内部存款和储蓄器占用,但实际上 WKWebView 是贰个多进程组件,Network Loading 以至 UI Rendering 在任何进度中进行。初次适配 WKWebView 的时候,大家也惊讶于打开 WKWebView 后,App 进度内部存款和储蓄器消耗反而小幅度减少,然而留意阅览会开采,Other Process 的内部存款和储蓄器占用会扩充。在有个别用 webGL 渲染的繁琐页面,使用 WKWebView 总体的内存占用(App Process Memory + Other Process Memory)不见得比 UIWebView 少非常多。

2.使用[NSURLProtocol]拦截

澳门唯一授权dc5566官网 1

在 UIWebView 上当内部存款和储蓄器占用太大的时候,App Process 会 crash;而在 WKWebView 受骗总体的内部存款和储蓄器占用超级大的时候,WebContent Process 会 crash,从而现身白屏现象。在 WKWebView 中加载上边包车型的士测量检验链接能够安静再现白屏现象:

分别于uiwebview wkwebview使用如下方法阻碍

NSUCRUISERLProtocol能阻碍全部基于U智跑L Loading System的网络央求。这里先贴一张UMuranoL Loading System的图:

http://people.mozilla.org/~rnewman/fennec/mem.html

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // 区别于uiwebview wkwebview使用如下方法拦截
  Class cls = NSClassFromString(@"WKBrowsingContextController");
  SEL sel = NSSelectorFromString(@"registerSchemeForCustomProtocol:");
  if ([(id)cls respondsToSelector:sel]) {
    [(id)cls performSelector:sel withObject:@"http"];
    [(id)cls performSelector:sel withObject:@"https"];
  }
}


# 注册NSURLProtocol拦截
- (IBAction)regist:(id)sender {
  [NSURLProtocol registerClass:[FilteredProtocol class]];
}


# 注销NSURLProtocol拦截
- (IBAction)unregist:(id)sender {
  [NSURLProtocol unregisterClass:[FilteredProtocol class]];
}

澳门唯一授权dc5566官网 2

以此时候 WKWebView.UEvoqueL 会变为 nil, 轻易的 reload 刷新操作已经失效,对于某个长驻的H5页面影响十分的大。

3.下载[zip] + 使用[SSZipArchive]解压

故此,能够阻碍的网络央求包涵NSUENCORELSession,NSU安德拉LConnection以致UIWebVIew。基于CFNetwork的网络央求,以至WKWebView的伸手是回天无力阻碍的。以往主流的iOS网络库,举例AFNetworking,Alamofire等网络库都是依照NSUEvoqueLSession或NSUTiguanLConnection的,所以那几个互连网库的互连网供给都得以被NSUCR-VLProtocol所拦截。还会有后生可畏部分年间相比较遥远的互连网库,比方ASIHTTPRequest,MKNetwokit等网路库都以依照CFNetwork的,所以那些互联网库的互联网伏乞相当小概被NSUXC60LProtocol拦截。

大家最后的解决方案是:

需要先 #import "SSZipArchive.h

如上文所说,NSUCR-VLProtocol是叁个抽象类。我们要动用它的时候供给创立它的三个子类。

A、借助 WKNavigtionDelegate

- (void)downloadZip {
  NSDictionary *_headers;
  NSURLSession *_session = [self sessionWithHeaders:_headers];
  NSURL *url = [NSURL URLWithString: @"http://10.2.138.225:3238/dist.zip"];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

  // 初始化cachepath
  NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
  NSFileManager *fm = [NSFileManager defaultManager];

  // 删除之前已有的文件
  [fm removeItemAtPath:[cachePath stringByAppendingPathComponent:@"dist.zip"] error:nil];

  NSURLSessionDownloadTask *downloadTask=[_session downloadTaskWithRequest:request completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
    if (!error) {

      NSError *saveError;

      NSURL *saveUrl = [NSURL fileURLWithPath: [cachePath stringByAppendingPathComponent:@"dist.zip"]];

      // location是下载后的临时保存路径,需要将它移动到需要保存的位置
      [[NSFileManager defaultManager] copyItemAtURL:location toURL:saveUrl error:&saveError];
      if (!saveError) {
        NSLog(@"task ok");
        if([SSZipArchive unzipFileAtPath:
          [cachePath stringByAppendingPathComponent:@"dist.zip"]
                  toDestination:cachePath]) {
          NSLog(@"unzip ok");// 解压成功
        }
        else {
          NSLog(@"unzip err");// 解压失败
        }
      }
      else {
        NSLog(@"task err");
      }
    }
    else {
      NSLog(@"error is :%@", error.localizedDescription);
    }
  }];

  [downloadTask resume];
}
@interface CustomURLProtocol : NSURLProtocol

iOS 9现在 WKNavigtionDelegate 新增加了二个回调函数:

4.迁移财富至[NSTemporary]

行使NSUTucsonLProtocol的首要能够分为5个步骤:注册—>拦截—>转载—>回调—>截至

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webViewAPI_AVAILABLE(macosx(10.11),ios(9.0));

[wkwebview]真机不扶持直接加载[NSCache]资源

注册:

对于基于NSUTiguanLConnection或许使用[NSURLSession sharedSession]创立的互连网央求,调用registerClass方法就可以。

[NSURLProtocol registerClass:[NSClassFromString(@"CustomURLProtocol") class]];

对此基于NSULANDLSession的网络央浼,必要通过安插NSU昂科雷LSessionConfiguration对象的protocolClasses属性。

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];sessionConfiguration.protocolClasses = @[[NSClassFromString(@"CustomURLProtocol") class]];

当 WKWebView 总体内部存款和储蓄器占用过大,页面将在白屏的时候,系统会调用上边的回调函数,我们在该函数里试行[webView reload](当时 webView.U奥迪Q5L 取值尚不为 nil)化解白屏问题。在部分高内部存款和储蓄器消耗的页面只怕会频仍刷新当前页面,H5侧也要做相应的适配操作。

亟需先搬迁能源至[NSTemporary]

拦截:

在阻碍到网络央求后,NSU哈弗LProtocol会相继实施下列方法:

+ canInitWithRequest:(NSURLRequest *)request

该方法会获得request的对象,我们能够经过该办法的重临值来筛选request是不是供给被NSUGL450LProtocol做阻止管理。譬如:

+ canInitWithRequest:(NSURLRequest *)request { NSString * scheme = [[request.URL scheme] lowercaseString]; if ([scheme isEqual:@"http"]) { return YES; } return NO;}

此间大家就只会阻止http的呼吁。

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request

在该方法中,大家得以对request实行管理。譬喻改正尾部新闻等。最后回来一个甩卖后的request实例。

B、检验 webView.title 是还是不是为空

- (void)migrateDistToTempory {
  NSFileManager *fm = [NSFileManager defaultManager];
  NSString *cacheFilePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"dist"];
  NSString *tmpFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"dist"];

  // 先删除tempory已有的dist资源
  [fm removeItemAtPath:tmpFilePath error:nil];
  NSError *saveError;

  // 从caches拷贝dist到tempory临时文件夹
  [[NSFileManager defaultManager] copyItemAtURL:[NSURL fileURLWithPath:cacheFilePath] toURL:[NSURL fileURLWithPath:tmpFilePath] error:&saveError];
  NSLog(@"Migrate dist to tempory ok");
}

转发:

在阻拦到互连网乞求,而且对网络须要举办定制管理今后。大家供给将网络恳求重新发送出去。

- initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id<NSURLProtocolClient>)client

该方法会创建一个NSUPRADOLProtocol实例,这里每多个网络诉求都会创设二个新的实例。

- startLoading

接下去正是转账的基本措施startLoading。在该方法中,大家把拍卖过的request重新发送出去。至于发送的款式,可以是依据NSULANDLConnection,NSU逍客LSession以致CFNetwork。

实际不是颇有H5页面白屏的时候都会调用上面的回调函数,比方,最近遇见在一个高内部存款和储蓄器消耗的H5页面上 present 系统相机,拍照达成后回到原本页面包车型客车时候现身白屏现象(拍照进程消耗了大量内部存款和储蓄器,导致内部存款和储蓄器恐慌,WebContent Process 被系统挂起),但地点的回调函数并从未被调用。在WKWebView白屏的时候,另豆蔻梢头种现象是 webView.titile 会被置空, 由此,可以在 viewWillAppear 的时等候检查查实验webView.title 是或不是为空来 reload 页面。

5.转会号令

回调:

既是面向切面包车型的士编制程序,就不可能影响到原本互连网要求的逻辑。所以上一步将互联网诉求转载出来之后,当接过互联网乞求的归来,还需求再将再次来到值再次来到给本来发送网络央求的地点。首要须求供给调用到

[self.client URLProtocol:self didFailWithError:error];[self.client URLProtocolDidFinishLoading:self];[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];[self.client URLProtocol:self didLoadData:data];

那七个法子来回调给原来发送网络央浼的地点。这里假若大家在转变进度中是采纳NSU景逸SUVLSession发送的网络央求,那么在NSUTucsonLSession的回调方法中,大家做相应的管理即可。何况大家也能够对这一个再次回到,进行定制化处理。

- URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if  { [self.client URLProtocol:self didFailWithError:error]; } else { [self.client URLProtocolDidFinishLoading:self]; }}- URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(NSURLSessionResponseDisposition))completionHandler { [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; completionHandler(NSURLSessionResponseAllow);}- URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:data { [self.client URLProtocol:self didLoadData:data];}

汇总以上三种办法能够缓和超越五成的白屏难题。

如果[/static]开头 => 则转发[Request]到本地[.css/.js]资源

结束:

在一个网络央浼完全截至之后,NSUENVISIONLProtocol回调用到

- stopLoading

在该办法里,大家成功在终止网络诉求的操作。以NSUHavalLSession为例:

- stopLoading { [self.session invalidateAndCancel]; self.session = nil;}

如上就是NSUMuranoLProtocol的骨干流程。

既然如此NSU宝马X5LProtocol成效特别常有力,那么在具体支出中,会有如何应用呢?

  • 互联网恳求缓存
  • 网络央浼mock stub,盛名的库OHHTTPStubs就是依照NSUEvoqueLProtocol
  • 互连网有关的数额总计
  • URL重定向
  • 合作落成HTTPDNS
  • ......

接纳NSU奥迪Q3LProtocol碰着的坑也特意多,有的是很罕有文档谈到所以未有留意到的,有的以致是时至前些天还未表明的。上面列举部分本身遇上的主题材料:

2、WKWebView Cookie 问题

如果[index.html]结尾 => 就直接[Load]本地[index.html] (否则[index.html]可能会加载失败State of Qatar

多个NSU昂科雷LProtocol嵌套使用

若贰个档次中设有七个NSU奥迪Q5LProtocol,那么NSU科雷傲LProtocol的阻拦顺序跟注册的艺术和顺序有关。*对于使用registerClass方法注册的景观:两个NSUHavalLProtocol拦截顺序为注册顺序的反序,即后注册的的NSUGL450LProtocol先阻止。*澳门唯一授权dc5566官网,对于经过配备NSUENCORELSessionConfiguration对象的protocolClasses属性来注册的境况:protocolClasses那一个数组里唯有首先个NSUPAJEROLProtocol会起作用。所以我们来看OHHTTPStubs库在注册的时候实行了如此的拍卖:

+ setEnabled:enable forSessionConfiguration:(NSURLSessionConfiguration*)sessionConfig{ // Runtime check to make sure the API is available on this version if ( [sessionConfig respondsToSelector:@selector(protocolClasses)] && [sessionConfig respondsToSelector:@selector(setProtocolClasses:)]) { NSMutableArray * urlProtocolClasses = [NSMutableArray arrayWithArray:sessionConfig.protocolClasses]; Class protoCls = OHHTTPStubsProtocol.class; if (enable && ![urlProtocolClasses containsObject:protoCls]) { [urlProtocolClasses insertObject:protoCls atIndex:0]; } else if (!enable && [urlProtocolClasses containsObject:protoCls]) { [urlProtocolClasses removeObject:protoCls]; } sessionConfig.protocolClasses = urlProtocolClasses; } else { NSLog(@"[OHHTTPStubs] %@ is only available when running on iOS7+/OSX9+. " @"Use conditions like 'if ([NSURLSessionConfiguration class])' to only call " @"this method if the user is running iOS7+/OSX9+.", NSStringFromSelector; }}

不怕把团结的NSU陆风X8LProtocol插入到protocolClasses的率先个,进行拦截。拦截成功之后,又举办移除。

Cookie 难点是日前 WKWebView 的一大短板

//
// ProtocolCustom.m
// proxy-browser
//
// Created by melo的微博 on 2018/4/8.
// Copyright © 2018年 com. All rights reserved.
//
#import <objc/runtime.h>
#import <Foundation/Foundation.h>
#import <MobileCoreServices/MobileCoreServices.h>
static NSString*const matchingPrefix = @"http://10.2.138.225:3233/static/";
static NSString*const regPrefix = @"http://10.2.138.225:3233";
static NSString*const FilteredKey = @"FilteredKey";
@interface FilteredProtocol : NSURLProtocol
@property (nonatomic, strong) NSMutableData  *responseData;
@property (nonatomic, strong) NSURLConnection *connection;
@end
@implementation FilteredProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
  return [NSURLProtocol propertyForKey:FilteredKey inRequest:request]== nil;
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
{
  NSLog(@"Got it request.URL.absoluteString = %@",request.URL.absoluteString);

  NSMutableURLRequest *mutableReqeust = [request mutableCopy];
  //截取重定向
  if ([request.URL.absoluteString hasPrefix:matchingPrefix])
  {
    NSURL* proxyURL = [NSURL URLWithString:[FilteredProtocol generateProxyPath: request.URL.absoluteString]];
    NSLog(@"Proxy to = %@", proxyURL);
    mutableReqeust = [NSMutableURLRequest requestWithURL: proxyURL];
  }
  return mutableReqeust;
}
+ (BOOL)requestIsCacheEquivalent:(NSURLRequest *)a toRequest:(NSURLRequest *)b
{
  return [super requestIsCacheEquivalent:a toRequest:b];
}
# 如果[index.html]结尾 => 就直接[Load]本地[index.html]
- (void)startLoading {
  NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
  // 标示改request已经处理过了,防止无限循环
  [NSURLProtocol setProperty:@YES forKey:FilteredKey inRequest:mutableReqeust];

  if ([self.request.URL.absoluteString hasSuffix:@"index.html"]) {

    NSURL *url = self.request.URL;

    NSString *path = [FilteredProtocol generateDateReadPath: self.request.URL.absoluteString];

    NSLog(@"Read data from path = %@", path);
    NSFileHandle *file = [NSFileHandle fileHandleForReadingAtPath:path];
    NSData *data = [file readDataToEndOfFile];
    NSLog(@"Got data = %@", data);
    [file closeFile];

    //3.拼接响应Response
    NSInteger dataLength = data.length;
    NSString *mimeType = [self getMIMETypeWithCAPIAtFilePath:path];
    NSString *httpVersion = @"HTTP/1.1";
    NSHTTPURLResponse *response = nil;

    if (dataLength > 0) {
      response = [self jointResponseWithData:data dataLength:dataLength mimeType:mimeType requestUrl:url statusCode:200 httpVersion:httpVersion];
    } else {
      response = [self jointResponseWithData:[@"404" dataUsingEncoding:NSUTF8StringEncoding] dataLength:3 mimeType:mimeType requestUrl:url statusCode:404 httpVersion:httpVersion];
    }

    //4.响应
    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [[self client] URLProtocol:self didLoadData:data];
    [[self client] URLProtocolDidFinishLoading:self];
  }
  else {
    self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
  }
}
- (void)stopLoading
{
  if (self.connection != nil)
  {
    [self.connection cancel];
    self.connection = nil;
  }
}
- (NSString *)getMIMETypeWithCAPIAtFilePath:(NSString *)path
{
  if (![[[NSFileManager alloc] init] fileExistsAtPath:path]) {
    return nil;
  }

  CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)[path pathExtension], NULL);
  CFStringRef MIMEType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);
  CFRelease(UTI);
  if (!MIMEType) {
    return @"application/octet-stream";
  }
  return (__bridge NSString *)(MIMEType);
}
#pragma mark - 拼接响应Response
- (NSHTTPURLResponse *)jointResponseWithData:(NSData *)data dataLength:(NSInteger)dataLength mimeType:(NSString *)mimeType requestUrl:(NSURL *)requestUrl statusCode:(NSInteger)statusCode httpVersion:(NSString *)httpVersion
{
  NSDictionary *dict = @{@"Content-type":mimeType,
              @"Content-length":[NSString stringWithFormat:@"%ld",dataLength]};
  NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:requestUrl statusCode:statusCode HTTPVersion:httpVersion headerFields:dict];
  return response;
}
#pragma mark- NSURLConnectionDelegate
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
  [self.client URLProtocol:self didFailWithError:error];
}
#pragma mark - NSURLConnectionDataDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
  self.responseData = [[NSMutableData alloc] init];
  [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
  [self.responseData appendData:data];
  [self.client URLProtocol:self didLoadData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
  [self.client URLProtocolDidFinishLoading:self];
}
+ (NSString *)generateProxyPath:(NSString *) absoluteURL {
  NSString *tmpFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"dist"];
  NSString *fileAbsoluteURL = [@"file:/" stringByAppendingString:tmpFilePath];
  return [absoluteURL stringByReplacingOccurrencesOfString:regPrefix
                         withString:fileAbsoluteURL];
}
+ (NSString *)generateDateReadPath:(NSString *) absoluteURL {
  NSString *fileDataReadURL = [NSTemporaryDirectory() stringByAppendingPathComponent:@"dist"];
  return [absoluteURL stringByReplacingOccurrencesOfString:regPrefix
                         withString:fileDataReadURL];
}
@end

有关不能够拦截WKWebView

由来是WKWebView 在单独于 app 进度之外的长河中试行网络诉求,乞求数据不通过主进度,由此,在 WKWebView 上直接选用 NSU奔驰M级LProtocol 不能够阻挡供给。具体能够参见 wkwebview的这一个坑那篇小说。作品也付出了不算圆满的减轻方案。

2.1、WKWebView Cookie存储

结语:

canInitWithRequest方法数十次调用

神跡会产出canInitWithRequest方法数十次调用的气象,那几个题目现身分外的意想不到,前段时间还不精通原因。可是因为大家在canInitWithRequest方法中会判定是或不是拦截过的符号。所以这一个标题不会潜濡默化到健康使用。此外还发掘,当大家在扩充互联网央求以前把缓存毁灭掉,也不会产出那一个标题。

产业界广泛认为 WKWebView 具有本人的个人存款和储蓄,不会将 库克ie 存入到标准的 Cookie 容器NSHTTPCookieStorage中。

完整[DEMO]请参考:

使用NSURLSession的坑

在NSUGL450LProtocol中动用NSUOdysseyLSession有无数不僧不俗的难点,基本上都以系统的bug。大家得以在 这里看看有关NSUEnclaveLProtocol的种类bug,基本都与NSUTiggoLSession有关。相比较显明的正是:

  • 阻止到的Request中的HTTPBody为nil;
  • startLoading在好几特殊处境会不能自已死锁;
  • 至于注册registerClass方法只适用于sharedSession创立的互联网伏乞;
  • ……

那些难点都以在应用NSUWranglerLProtocol必要特别注意的。

NSUSportageLProtocol的有力功效,为iOS网络开拓提供了要命大的可操作空间。在商业类型中,也获取了常见的使用,但大家在应用的还要,也要小心防止NSU冠道LProtocol存在的主题材料。不过辛亏搭飞机iOS系统的演变,关于NSUMuranoLProtocol的种类bug已经越来越少。

实践开掘 WKWebView 实例其实也会将 库克ie 存款和储蓄于 NSHTTPCookieStorage 中,但存储机会有延期,在iOS 8上,当页面跳转的时候,当前页面包车型客车 Cookie 会写入 NSHTTPCookieStorage 中,而在 iOS 10 上,JS 实践 document.cookie 或服务器 set-cookie 注入的 Cookie 会超快同步到 NSHTTPCookieStorage 中,FireFox 技术员曾提议通过 reset WKProcessPool 来触发 库克ie 同步到 NSHTTPCookieStorage 中,施行发掘不起成效,并恐怕会掀起当前页面 session cookie 遗失等难题。

上述正是本文的全体内容,希望对我们的上学抱有助于,也冀望大家多多指教脚本之家。

WKWebView 库克ie 难题在于 WKWebView 发起的号令不会活动带上存款和储蓄于 NSHTTPCookieStorage 容器中的 Cookie

你或然感兴趣的稿子:

  • WKWebView、WebView和JS的人机联作情势详细解释
  • iOS WKWebView不能管理UEscortL Scheme和App Store链接的标题一蹴而就
  • JS人机联作点击WKWebView中的图片达成预览效果
  • iOS11 WKWebView难点集中
  • iOS11 WKWebView 不可能加载内容的化解措施
  • iOS中WKWebView白屏难点的分析与缓慢解决
  • iOS11 WKWebView内容过滤准绳详细明白
  • IOS中UIWebView、WKWebView之JS交互
  • 清除WKWebView cookies的方法
  • ios下OC与JS交互之WKWebView

比如,NSHTTPCookieStorage 中存款和储蓄了叁个 Cookie:

name=Nicholas;value=test;domain=y.qq.com;expires=Sat,02May201923:38:25GMT;

经过 UIWebView 发起倡议http://y.qq.com,则央求头会活动带上 cookie: Nicolas=test;

而经过 WKWebView发起必要http://y.qq.com,供给头不会自动带上 cookie: 尼古Russ=test。

2.2、WKProcessPool