美文网首页
离线加载原理,以及拦截任意Scheme

离线加载原理,以及拦截任意Scheme

作者: xiaoliang1 | 来源:发表于2023-04-10 15:16 被阅读0次

今天看到阿里的mpass上有离线加载H5,简单研究了这里用WebKit的WKURLSchemeHandler那套,非NSURLProtocol,间接的跨域。其实拿来做逆向破解也不是不可以
主要code:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.webHandler = [[MySchemeHandler alloc] init];
    WKWebViewConfiguration *webViewConfiguration = [[WKWebViewConfiguration alloc] init];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"myScheme://myScheme.test.cn/index.html"] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10.0f];
    [webViewConfiguration setURLSchemeHandler:self.webHandler forURLScheme:@"myScheme"];
    [webViewConfiguration setURLSchemeHandler:self.webHandler forURLScheme:@"http"];
    self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:webViewConfiguration];
    [self.webView loadRequest:request];
    [self.view addSubview:self.webView];
}

这里支持http、https的拦截
MySchemeHandler.m的主要代码:

- (void)webView:(nonnull WKWebView *)webView startURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask {

    NSLog(@"拦截到请求的URL:%@", urlSchemeTask.request.URL);
    NSString *localFileName = [urlSchemeTask.request.URL lastPathComponent];
    
    
    if([localFileName isEqualToString:@"getIp.php"]){
        //拦截到的 http的XMLHttpRequest的异步请求
        NSURLSessionDataTask *session = [[NSURLSession sharedSession] dataTaskWithRequest:urlSchemeTask.request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            
            [urlSchemeTask didReceiveResponse:response];
            [urlSchemeTask didReceiveData:data];
            [urlSchemeTask didFinish];
        }];
        [session resume];
        return;
    }
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"];
    NSString *html = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
    NSData *data = [html dataUsingEncoding:4];
    NSString *fileMIME = [self getMIMETypeWithCAPIAtFilePath:path];
    NSDictionary *responseHeader = @{
                                     @"Content-type":fileMIME,
                                     @"Content-length":[NSString stringWithFormat:@"%lu",(unsigned long)[data length]]
                                     };
    NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", @"myScheme://myScheme.test.cn/", @"index.html"]] statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:responseHeader];
    [urlSchemeTask didReceiveResponse:response];
    [urlSchemeTask didReceiveData:data];
    [urlSchemeTask didFinish];
}

实现拦截http,https的拦截的主要代码:

CHDeclareClass(WKWebView)
CHClassMethod1(BOOL, WKWebView, handlesURLScheme, NSString *, urlScheme) {
    
    if([urlScheme isEqualToString:@"http"] || [urlScheme isEqualToString:@"https"]) {
        
        return NO;
    }
    
    return CHSuper1(WKWebView, handlesURLScheme, urlScheme);
}
__attribute__((constructor())) static void entry3() {
    
//   写到 XLWebViewConfiguration load 也可
    CHLoadLateClass(WKWebView);
    CHClassHook1(WKWebView, handlesURLScheme);
}

代码demo:https://github.com/LoveSVN/MySchemeHandler.git
最后的效果图:

WechatIMG6.jpeg WechatIMG3.png WechatIMG4.png WechatIMG5.png

相关文章

  • 2021-01-23面试题

    HTML5的文件离线储存怎么使用,工作原理是什么? 离线缓存优点:没有网络的时候可以浏览,加快资源的加载速度,减少...

  • WKWebview 拦截 Scheme

    WKWebView 只允许开发者拦截自定义 Scheme 的请求,如果在方法 - [WKWebViewConfig...

  • Flutter下实现WebView拦截加载离线资源

    在用移动设备加载H5页面时,一些公共资源如css,js,图片等如果比较大时,就需要通过拦截网络,改从本地资源加载。...

  • Native/JS交互方案

    Native/JS交互方案 标签(空格分隔): Hybird 1. 方案一 scheme拦截(JSBridge) ...

  • URL Scheme测试

    一.IOS Scheme的制作 二.IOS Scheme原理 三.测试方法 四.测试点

  • iOS下的JS和原生的交互

    JS代用原生OC 方式一:url拦截,这里略过 注意:在iOS中拦截到的url scheme将全部转化为小写; h...

  • eth钱包开发--java(附带eth离线交易工具类)

    本篇主要说明如何离线生成ETH地址和进行离线交易 通过助记词离线生成钱包地址 关于助记词和HD钱包原理的原理可以参...

  • UIWebView:JS调用OC

    一:Custom URL Scheme(拦截URL) 二:JavaScriptCore 比如js中我定义了一个分享...

  • spring boot整合web开发-4-注册、配置拦截器

    拦截器原理: 拦截器的原理很简单,是 AOP 的一种实现,专门拦截对动态资源的后台请求,即拦截对控制层的请求。使用...

  • 简记

    jvm 模型 以及类加载机制 mybatis 分页原理,resulttype与resultmap区别 责任链模式...

网友评论

      本文标题:离线加载原理,以及拦截任意Scheme

      本文链接:https://www.haomeiwen.com/subject/efqwddtx.html