精华内容
下载资源
问答
  • 先简单介绍下我在工作中关于WKWebView的使用场景:1、首先是从后台获取到HTML富文本字符串内容,然后使用WKWebView加载出来2、将CSS样式文件下载到沙盒,以及将CSS样式文件预存到应用程序资源路径下,使用WKWebView...

    先简单介绍下我在工作中关于WKWebView的使用场景:

    1、首先是从后台获取到HTML富文本字符串内容,然后使用WKWebView加载出来

    2、将CSS样式文件下载到沙盒,以及将CSS样式文件预存到应用程序资源路径下,使用WKWebView加载样式文件。CSS文件下载成功的情况下使用下载的CSS文件,要是下载失败就使用程序资源路径下的CSS文件

    加载资源路径下的CSS文件

    //imageJS为HTML富文本字符串内容

    var imageJS = """

    \(self.HTMLContentStr)

    """

    //self.HTMLContentStr为HTMLbody的内容

    //cssFileName为CSS样式文件的名字

    cssFileUrl = Bundle.main.bundlePath

    //采用loadHTMLString方式加载

    self.contentWeb.loadHTMLString(imageJS, baseURL: URL(fileURLWithPath: cssFileUrl))

    此处温馨提示下,项目中使用多个TARGETS的话,记得把CSS文件的Target Membership 勾上:

    截屏2019-10-11下午2.52.44.png

    加载沙盒路径下的CSS文件

    尝试一:

    self.contentWeb.loadHTMLString(imageJS, baseURL: URL(fileURLWithPath: cssFileUrl))

    //imageJS与上面一样

    //cssFileUrl改为沙盒中CSS文件的路径

    样式文件没有生效,尝试失败。

    尝试二:

    self.contentWeb.loadHTMLString(imageJS, baseURL: URL(fileURLWithPath: cssFileUrl, isDirectory: false))

    //imageJS与上面一样

    //cssFileUrl为沙盒中CSS文件的路径

    这个时候用模拟器跑出来是可以正确加载CSS文件的,可是换成真机却没效果了❓❓❓❓❓❓❓❓

    这里我尝试了很多办法,可在真机情况下依旧无法加载CSS文件,如果有解决办法,欢迎在评论区讨论🐼

    尝试三:

    换一种加载方式,使用:

    open func loadFileURL(_ URL: URL, allowingReadAccessTo readAccessURL: URL) -> WKNavigation?

    do {

    //将HTML富文本内容写入沙盒CSS同一文件夹下,采用loadFileURL方式加载

    //cssFileUrl为沙盒中CSS文件所在文件夹的路径

    let _ = try imageJS.write(to: URL(fileURLWithPath: cssFileUrl + "/content.html"), atomically: true, encoding: .utf8)

    let contentURL = URL(fileURLWithPath: cssFileUrl + "/content.html")

    let AccessURL = URL(fileURLWithPath: cssFileUrl)

    self.contentWeb.loadFileURL(contentURL, allowingReadAccessTo: AccessURL)

    }catch{

    }

    模拟器运行正常,真机运行正常🤠🤠🤠🤠

    注意 注意 注意 cssFileUrl为沙盒中CSS文件所在文件夹的路径,即下图中cssFile文件的路径。

    截屏2019-10-11下午3.37.53.png

    总结下

    WKWebView使用:

    open func loadHTMLString(_ string: String, baseURL: URL?) -> WKNavigation?

    在真机下可以正确加载资源路径下的CSS文件,而在沙盒路径下的CSS文件不能正确加载(如果该方法有加载沙盒路径CSS文件的方法,欢迎大家在评论区告诉我😁😁😁)

    WKWebView使用:

    open func loadFileURL(_ URL: URL, allowingReadAccessTo readAccessURL: URL) -> WKNavigation?

    在真机下可以正确加载沙盒路径下的CSS文件。资源路径为只读,不可写入就不讨论了。

    展开全文
  • WKWebView 播放下载的本地mp4文件

    千次阅读 2018-06-06 11:40:22
    WKWebView 播放下载的本地mp4文件WKWebView 使用video标签是可以通过使用相对位置或者使用绝对路径播放本地mp4文件的scr="/**.mp4" or scr="file:///*****"这里有两个问题1.视频文件是直接打包...

    WKWebView 播放下载的本地mp4文件

    WKWebView 使用video标签是可以通过使用相对位置或者使用绝对路径播放本地mp4文件的

    scr="/**.mp4" or scr="file:///*****"

    这里有两个问题

    1.视频文件是直接打包到APP内的

    在模拟器和真机上都可以使用上面的两种方式进行播放mp4文件


    2.视频是下载下来的,放到Document或者library目录下

    在模拟器里可以使用上面两种方式进行播放mp4文件,但是在真机上(iOS 8-11)是播放不了。此时需要将mp4文件拷贝一份到tmp目录下,然后使用tmp目录下的绝对路径进行播放。

    展开全文
  • <p><strong>self</strong>.script = @"";  <strong>self</strong>.script = @"var xhr = new XMLHttpRequest();";  NSString* open =...请教大神门</p>
  • 实现了WKWebView网络请求拦截,并下载静态资源文件,加载时优先通过本地资源文件进行加载
  • WKWebViewDemo.zip

    2020-04-15 18:45:47
    1. 利用iOS原生WKWebView打开 H5 游戏的同时将整个游戏所需的资源文件下载到本地沙盒目录下,便于第二次秒开(加载时优先通过本地资源文件进行加载) 2.此工程也可适用于打开 H5 商城,也可便于实现秒开 原理:在第...
  • iOS的一些示例,不定时更新~ 由于内容较多,文件会有点大,建议终端用git clone命令下载,这样以后只需git pull更新。GitHub:https://github.com/wsl2ls/iOS_Tips.git 目录 1、暗黑模式 2、AppleID登录应用 3、...

    iOS_Tips

    iOS的一些示例,不定时更新~ 由于内容较多,文件会有点大,建议终端用git clone命令下载,这样以后只需git pull更新。GitHub:https://github.com/wsl2ls/iOS_Tips.git

    目录

    1、暗黑模式
    2、AppleID登录应用
    3、AVFoundation 高仿微信相机拍摄和编辑
    4、AVFoundation 人脸检测
    5、AVFoundation 实时滤镜
    6、GPUImage框架的使用
    7、VideoToolBox和AudioToolBox音视频编解码
    8、OpenGL ES学习
    9、LeetCode算法练习
    10、键盘和UIMenuController的并存问题
    11、iOS Crash防护
    12、WKWebView相关

    1、 暗黑模式适配

    在这里插入图片描述

    2、AppleID登录应用

    • 查看本仓库下的AddingTheSignInWithAppleFlowToYourApp

    3、微信相机拍摄照片、小视频以及编辑功能

    效果描述:

    • 1、自定义相机 拍摄视频和照片
    • 2、切换前后摄像头、调整焦距/设置聚焦点、横屏拍摄
    • 3、视频编辑:涂鸦、gif贴图、文字水印、视频裁剪 、添加背景音乐
    • 4 、图片编辑:涂鸦、贴图、文字水印、马赛克、图片裁剪

    主要类:SLAvCaptureTool(音视频采集录制工具)、SLAvEditExport(导出编辑的音视频)。关于视频的压缩问题,可以通过降低采集时的分辨率sessionPreset、降低写入文件时的分辨率(AVVideoWidthKey宽AVVideoHeightKey高)和码率(AVVideoCodecKey)、指定高的FormatProfile(AVVideoProfileLevelKey)等方法来实现,同时也要保证一定的清晰度满足业务的需求, 可以看看这篇文章https://www.jianshu.com/p/4f69c22c6dce

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    4、人脸检测

    在这里插入图片描述

    5、实时滤镜拍摄和导出

    主要类: 是由SLAvCaptureTool拆分的 SLAvCaptureSession(采集) + SLAvWriterInput(录制) 两个工具类,方便扩展,录制写入实现的方式也略有不同

    在这里插入图片描述

    6、GPUImage框架的使用

    效果描述:实时拍摄添加水印和滤镜、本地视频添加水印、GIF图水印

    在这里插入图片描述

    7、VideoToolBox和AudioToolBox音视频编解码

    请查看本仓库下的 VideoEncoder&Decoder 文件

    在这里插入图片描述

    8、OpenGL ES学习

    示例描述:

    • 1、GLKit 绘制图片和正方体
    • 2、GLSL 绘制金字塔、颜色纹理混合
    • 3、GLSL 滤镜集合:灰度、旋涡、正方形马赛克、六边形马赛克
    • 4 、GLSL 抖音部分特效:分屏、缩放、抖动、灵魂出窍、毛刺

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    9、LeetCode算法练习

    LeetCode算法练习集合(Swift版) ~ 每天一道算法题

    10、键盘和UIMenuController的并存问题

    在这里插入图片描述

    在这里插入图片描述

    11、iOS Crash防护

    NSArray/NSMutableArray、NSDictionary/NSMutableDictionary、NSString/NSMutableString、Unrecognized Selector、KVO、KVC 、野指针定位、内存泄漏/循环引用

    12、WKWebView相关

    WKWebView的使用、WKWebView+UITableView混排、UIScrollView实现原理、WKWebView三级缓存功能

    WKWebView

    Welcome To Follow Me

    您的follow和start,是我前进的动力,Thanks♪(・ω・)ノ

    欢迎扫描下方二维码关注——奔跑的程序猿iOSer——微信公众号:iOS2679114653 本公众号是一个iOS开发者们的分享,交流,学习平台,会不定时的发送技术干货,源码,也欢迎大家积极踊跃投稿,(择优上头条) _分享自己开发攻城的过程,心得,相互学习,共同进步,成为攻城狮中的翘楚!

    iOS开发进阶之路.jpg

    展开全文
  • WKWebView对网页和js,css,png等资源文件都进行缓存。...最佳解决方案是js中对每一个网址,js,css,png等资源文件下载地址都加版本号,这样既利用了WKWebView缓存机制又实现了他们按照需要刷新。...

    WKWebView对网页和js,css,png等资源文件都进行缓存。iOS8是采用清除js本地文件方法刷新缓存,iOS9及以后调用WKWebView清除缓存接口按照指定时间戳清楚缓存(由于是批量清除缓存可以用在用户登出清除数据,设置页面缓存数据清理)。最佳解决方案是js中对每一个网址,js,css,png等资源文件下载地址都加版本号,这样既利用了WKWebView缓存机制又实现了他们按照需要刷新。
    WKWebView在独立于app进程之外的进程中执行网络请求,请求数据不经过主进程。不使用NSURLProtocol进行拦截你将看不到js,css,png文件的下载请求,也不能准确获取页面html代码(NSString *url = [NSString stringWithContentsOfURL:webView.URL encoding: NSUTF8StringEncoding error:nil];
    NSLog(@“webView.URL:%@”,url);)。WKWebView 是一个多进程组件。在不注册 http(s) scheme的情况下,它都是独立运行的,作为进程它有自己的沙盒,它的缓存机制都是基于自己的沙盒进行的,但是它会在请求的不同时机回调app的代理函数,同步数据到app自己的沙盒。并且canInitWithRequest拦截到请求很少,js,cs,png等资源请求拦截不到。最显然的是fsCachedData目录下只有一个文件,而UIWebView这个文件夹下是存的绝大多书网页数据。有人说可以通过删除fsCachedData目录下的所有文件来刷新缓存,通过代码获得的html网页也都是第一微信授权的网页,当前html网页代码无法拿到。那是傻白甜,根本没有实际测试过。你想想WKWebView和app就不运行在一个进程中,网页数据也不在fsCachedData目录下,你删吧删吧,我不怕,因为我不在你家。所以你要想研究WKWebView的缓存机制,那么你就需注册 http(s) scheme。
    在注册 http(s) scheme([NSURLProtocol wk_registerScheme:@“https”];具体SURLProtocol怎么用,大家在网上搜索一下吧,后期我会写一篇关于js标签图片在iOS替换的文章有相关的介绍)的情况下,app的canInitWithRequest函数会拦截该应用向服务器发送的所有https网络请求(包括js,cs,png等资源请求,注意:拦截的请求是WKWebView在HTTPHeaderField加入cookie前的请求,所以在canInitWithRequest函数打印:

    NSLog(@”canInitWithRequest request.URL.absoluteString = %@,请求方式 == %@,scheme:%@,request.allHTTPHeaderFields:%@”,urlStr,request.HTTPMethod,scheme, request.allHTTPHeaderFields);
    

    得到是null,如:

    2018-08-23 14:16:51.390805+0800 ArtEnjoymentWeChatAuction[12030:1142813] canInitWithRequest request.URL.absoluteString = https://m.1-joy.com/market/product/cat/list.htm,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:(null))。
    

    可以通过下面代码获取绝大部份网页实时的html地址(一个网页地址有两个网页地址组成网址,didFinishNavigation函数不回调,所以无法在该函数拦截html内容):

    -(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
        
        NSString *url = [NSString stringWithContentsOfURL:webView.URL encoding: NSUTF8StringEncoding error:nil];
        NSLog(@"webView.URL:%@",url);
    }
    

    注意:不能在canInitWithRequest拦截html网页内容,否则应用卡死(NSLog(@“canInitWithRequest request.URL.absoluteString html = %@”,[NSString stringWithContentsOfURL:request.URL encoding: NSUTF8StringEncoding error:nil]);相当于挂掉)。
    下面是拦截部分资源下载日志:

    2018-08-23 17:10:35.789991+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/framework7/css/framework7.ios.min.css?t=20170913,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "text/css,*/*;q=0.1";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.790651+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/framework7/css/framework7.ios.colors.min.css?t=20170913,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "text/css,*/*;q=0.1";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.793056+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/iconfont/iconfont.css?t=201709040,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "text/css,*/*;q=0.1";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.793356+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/css/portal/homepage.css?t=201808201,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "text/css,*/*;q=0.1";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.831559+0800 ArtEnjoymentWeChatAuction[12762:1212644] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/ad/2018-08-16/1534381323636.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.834105+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/product/cat/cat_saving.gif,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.840877+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/product/cat/success.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.841287+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/gift/agent/icon_agent1.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.842194+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/gift/agent/icon_manage0.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.843483+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/image/gift/agent/icon_mine.png,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.855106+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/js/weipaiApp.js?t=20180711,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "*/*";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:35.855898+0800 ArtEnjoymentWeChatAuction[12762:1212673] canInitWithRequest request.URL.absoluteString = https://3rd.m.1-joy.com/market/statics/requirejs/require.min.js,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "*/*";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.310192+0800 ArtEnjoymentWeChatAuction[12762:1212497] canInitWithRequest request.URL.absoluteString = https://retcode.alicdn.com/retcode/bl.js,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "*/*";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.348154+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://pingjs.qq.com/h5/stats.js?v2.0.4,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "*/*";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.375037+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-17/38420834086211791132.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.375668+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-17/38423043293403921636.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.379911+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-19/38611798295143741803.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.384717+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-17/38436551652203585654.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.387161+0800 ArtEnjoymentWeChatAuction[12762:1212645] canInitWithRequest request.URL.absoluteString = https://image.oss.m.1-joy.com/2018-07-19/38558784537883998985.jpg?x-oss-process=style/340x204,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "image/png,image/svg+xml,image/*;q=0.8,video/*;q=0.8,*/*;q=0.5";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    2018-08-23 17:10:36.490542+0800 ArtEnjoymentWeChatAuction[12762:1212855] canInitWithRequest request.URL.absoluteString = https://cdn.m.1-joy.com/market/statics/js/require.config.js?t=201808231,请求方式 == GET,scheme:https,request.allHTTPHeaderFields:{
        Accept = "*/*";
        Referer = "https://m.1-joy.com/market/product/cat/list.htm";
        "User-Agent" = "Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15G77Yixiangweipai/0.0.1";
    }
    

    第一次app安装运行进入h5页面后,你几乎可以看到所有的资源请求,当页面加载完毕,再次运行发现这些请求被拦截到的很少了,当你第三次关闭应用再次进入该h5页面,你发现,这些资源请求都不发送了。只有下面这三个请求了,一个阿里云统计请求,一个微信授权相关的请求,一个html请求。拦截不到请求说明没有下载资源,第二次运行应用进入对应页面,虽然拦截到少量的请求,实际上这少量的请求也没有下载只是取本地数据,并非是拦截到请求就一定远程下载资源。当然你进入h5页面,点击进入另一个h5页面(同一个UIViewController)再返回,那么也没有拦截资源请求。
    那个返回的情况,WKWebView帮你把所有资源(包括html内容),所以返回很快。只所以出现app第二次进入h5页面,有少部分资源拦截到请求,是因为app和WKWebView在同步资源,只所以出现第三次进入h5页面所有资源请求(不包括html页面内容请求)都没有发送,那是因为WKWebView的缓存机制生效,取的本地资源。
    html页面被加载有一个显著标志是加载进度显示进度,但是进度条显示进度并非说向服务器发送了请求,同时显示加载进度条也是原生页面和h5页面的一个最显著标志。当进入下一个h5页面(同一个UIViewController,页面跳转由h5自己控制)再返回,显然可以看到速度飞快,可见它吧整个页面的数据都缓存了。WKWebView返回时使用的是本地数据最直接的证据,进入下一个h5页面,把手机设置成飞行模式,然后返回上一个页面,你会看到能正常返回,可以看到它缓存了访问过的数据。但是你在飞行模式下在点击进入刚才进入的页面,页面加载错误。所以WKWebView是缓存前面访问过的所有页面(包括html内容),但是不是你访问过这个页面返回了再次进入就全部取本地数据,至少html内容需要重新获取,cs,js,png等资源文件取的缓存数据。若用户从A页面进入B页面(同一个UIViewController,页面跳转由h5自己控制),在B页面操作过后想强制刷新A页面怎么办。其实你返回到A页面后调用这句话([self.wkWebView reload];)就能强制刷新A页面。真正大头的费时间费流量的不是html文件,也不是cookie,而是cs,js,png等资源文件。那么如何刷新这些资源呢?由于WKWebView的fsCachedData文件夹下只有一个文件,并且WKWebView是一个独立进程,你删除并不能清楚WKWebView的数据。经过测试在删除fsCachedData文件夹,关闭应用在此进入应用,资源请求不被重新下载,所以删除fsCachedData文件夹不能清除缓存数据。
    你想清除缓存只需要删除NetworkCache文件夹及其下面的文件就能保证所有资源重新下载,我已经进行过测试。这是最低支持iOS 8的解决方案,因为iOS 9以上有针对WKWebView的清缓存API,很显然上面的方法会有弊端。。。。。。以上方法,可以删除jsp的,但是不能删除HTML静态资源的那种,不知道是什么原因,反正我测试了一下,就是无法清除静态静态资源。html和jsp的区别–静态页面和动态页面的区别 。代码如下:

    - (void)clearWbCache{
        //    (NSHomeDirectory)/Library/Caches/(current application name, [[NSProcessInfo processInfo] processName])
        // 清除缓存
        [[NSURLCache sharedURLCache] removeAllCachedResponses];
        [[NSURLCache sharedURLCache] setDiskCapacity:0];
        [[NSURLCache sharedURLCache] setMemoryCapacity:0];
        // 清除磁盘(上面两句就是已经执行好了,下面只是一个思路)  路径来源可以看上面的图(不过这里)
        /*
        NSString *libraryDir = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES)[0];
        NSString *bundleId = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
        NSString *webkitFolderInLib = [NSString stringWithFormat:@"%@/WebKit",libraryDir];
        NSString *webKitFolderInCaches = [NSString stringWithFormat:@"%@/Caches/%@/WebKit",libraryDir,bundleId];
        NSError *error;
        [[NSFileManager defaultManager] removeItemAtPath:webKitFolderInCaches error:&error];
        [[NSFileManager defaultManager] removeItemAtPath:webkitFolderInLib error:nil];
        */
        }
    iOS 9之后有了新的API
    
    // 清除部分,可以自己设置
    // NSSet *websiteDataTypes= [NSSet setWithArray:types];
    
    // 清除所有
    NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
    
         Date from
    
        NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
    
         Execute
    
        [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
    
            // Done
            NSLog(@"清楚缓存完毕");
    
        }];
    

    URL更新的时候带上版本号
    其实每次你URL没有更新,但是你的内容已经更新了,由于缓存的原因,你还是只能读取缓存,这个时候你让地址都带上版本号,就能区别统一url下缓存了。
    由于苹果就是以网页的url和资源的url来缓存数据。至于url和文件名的对应关系我测试很多编码方式也没有试出来,苹果也没有公开这种加密方法。
    该方法适用于网页的url地址和cs,js,png等资源的缓存与刷新标准。所以想对资源进行刷新,只需要发布js网页时修改资源地址对应的版本号就可以。最好对所有js页面设置管理页面,把每个网页和资源都对应一个版本号,这样可以直观的管理。发布页面时修改对应的版本号,不需要在代码中找到对应的网址加上版本号,特别时多个地方使用同一个资源时,若一个一个改即麻烦而且容易漏掉,还是做一个管理页面比较好。cs,js,png等资源文件一般都比html文件大的多,现在手机动不动4000万像素的摄像头,一张图片达到10兆不在话下,何况单反的超大分辨率(该类图片采用非尺寸压缩后仍然达到2兆以上也很正常,具体见文站《图像的压缩算法–尺寸压缩、格式压缩和品质压缩》)。所以cs,js,png等资源文件的下载地址加版本号是空前必须。
    WKWebView从A页面进入B页面,再返回它取缓存的数据,不重新加载A页面的数据。那么如何重新加载A页面呢?只是这种必须不取缓存,必须重新加载页面的情况比较少,可以特别处理,当这类的页面换回时调用[self.wkWebView reload];来重新刷新页面。当每次进入一个页面或加载一个图片地址时都重新获取,只需要app端对它们的下载地址加上时间戳(精确到毫秒)就可以实现不取缓存数据实时加载数据。至于cs,js,png等资源文件想前面的地址不变,想根据需要实时刷新资源,那么只有js的代码给他们的资源加上版本号或时间戳(我提倡使用时间戳,因为它没有物理意义。更不提倡每次js发版本都对是否需要更新都加上最新时间戳(这是破坏WKWebView缓存机制),最好是加版本号)。至于阿里云的图片地址,我们的应用是采用和每次生成新生成的uuid相关的图片上传地址,没有重复的,所以可以对这类不重复的png等图片地址不加版本号。
    至于cookie的缓存,由于WKWebView是多进程组件,每一个WKWebView页面控制器刚建立时Cookies.binarycookies文件为空,苹果没有可用的接口给它传递上个控制器的cookie,你就时加入请求的head里也在建立新WKWebView进程时被清空。所以采用多WKWebView控制器的方式实现cookie共享是没有办法的。当从WKWebView页面进入另一个控制器里发送普通https请求在消息头了加入cookie是可以的。具体参照文章《多个WKWebView页面的cookie不共享问题及解决方案》
    下面是对js的缓存文件的分析,如何获这些目录见文章《如何在不越狱的情况下,获取app中的所有常用文件和文件夹》
    采用[NSURLProtocol wk_registerScheme:@“https”];拦截后,经过分析/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/com.yixiang.agent/fsCachedData目录下的文件28个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Blobs目录下的文件22个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Records/44235F1B08CDC79B63B58D6BC4CDD688AB5A0A1D/Resource目录下的文件54个。其中目录fsCachedData下存放的是敏感的数据(在https协议拦截,对所有请求打印日志情况下),如:F3ACCC0B-6963-4390-8D07-1F4E2BB62457文件存储的是js注入的WKWebView代码(js和WKWebView互调的代码),3EF36A7A-A565-4418-983E-BA362C39F120是其中的一个html代码。
    不采用https拦截的,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/com.yixiang.agent/fsCachedData目录下的文件1个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Blobs目录下的文件23个,/var/mobile/Containers/Data/Application/5A24D2C8-5A5D-48D6-B9DF-B7B615E5F4E1/Library/Caches/WebKit/NetworkCache/Version 12/Records/73C8324CFCDD81F3D3BA81939DAA4F7F42E34E56/Resource目录下的文件54个。其中Blobs目录下存放的是最核心的数据,5BD40BA5EFBAF3F10186DE4D2EF04FDABE2682CC是其中的一个html代码。
    参考文章:《【腾讯Bugly干货分享】WKWebView 那些坑》

    展开全文
  • 问题描述:在webView中点击下载按钮后,下载成功文件,然后再去点击上传文件,这时候服务器会报用户未登录错误。 暂时分析的原因是WKWebView下载后cookie会保存服务器产生的sessionID, 当点传的时候,虽然上传...
  • iOS-WKWebView的封装

    千次阅读 2017-07-17 11:59:14
    前言:之前用的UIWebView,自从8.0WKWebView出来以后,不仅内存更为优化,滑动更为流畅之外,苹果还提供了丰富的类库,最近也是应公司跨平台要求,找了许久资料,算是做了一个小封装。当然很多朋友会说,那我没有...
  • 出现问题情况是:将uiwebview换成wkwebview之后,之前将webview上那些图片放回本地下载后缓存的图片没办法在webview上找到,最后排查出原因是,wkwebview需要将图片和网页文件放在同个路径下。 具体实现方法如下...
  • 需求想让点击'下载'的时候把图片下载到相册,查看web页发现,需要保存到相册的内容是PDF,不是图片,因为这个web页面是银行的,不是我们自己的,而且没法直接拿到这个PDF的下载地址进行文件下载; 想着就先把web页...
  • 但是我做了一个PPT,更方便和详细的介绍了两者的用法和区别,并在调试中遇到的问题,详细请下载demo文件,内含PPT、demo源码二、调研笔记:调研UIWebview和WKWebview异同点 1、UIWebview+Javasc
  • 最近做资料文件下载下来并查看的时候,用 WKWebView 打开office 类型的文件的时候是没问题的,但是打开测试人员上传的一个 TXT 文件就出现了乱码问题,经过查看,应该是文件的编码问题,于是找了两种方式来解决出现...
  • 下载远程附件,并且预览 pod文件增加 pod 'AFNetworking', '~> 4.0' // 在发送请求之前,决定是否跳转 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)...
  • 修改 /Users/nmlhm/Qt5.7.1/5.7/Src/qtwebview/src/webview/qwebview_ios.mm 文件中QtWebViewDelegate类,添加WKNavigationDelegate代理函数-(void)webView:(WKWebView*)webViewdecidePolicyForNavigationAction:...
  • 一些问题 记录

    2018-04-26 18:16:01
    然后下载文件,显示包内容,即是沙盒内的文件。   在真机上, 不能move bundle中的文件到document目录下 ,但是 copy 可以, 可以copy bundle中的文件到 document。   WKWebview不支持 NSURLProto...
  • H5资源本地化策略-IOS

    2019-12-06 01:22:23
    前言 为了增强用户首次打开页面的体验,减少页面白屏时间,实现js、css、image、json等资源文件的本地映射。... 1、资源拦截的过程 web端发起资源加载的... 没有匹配到有效的资源,下载文件后回传给web端; WKWebView
  • 适用于macOS的Netflix包装器 一个非常简单的概念验证应用程序,用于基于WKWebView的应用程序,允许在macOS的浏览器之外... 如果您不小心下载了源代码,则会感到很困惑,因此请返回上一步并下载另一个zip文件。 这就
  • 网络下载pdf文件并保存,使用WKWebView展示: NSURL *url = [NSURL fileURLWithPath:_localFilePath]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; 只有机型...
  • AFNetworking - ASI不升级以后,最多人用的网络连接开源库,iOS网络编程之AFNetworking使用,iOS开发下载文件速度计算 , AFNetworking 3.0迁移指南 , AFNetworking2.0源码解析<一> 、AFNetworking2.0源码解析<二>、A
  • 下载.deb文件包文件夹 将deb文件SCP放入您的设备 dpkg -i com.evilpenguin.networksniffer_0.1.0-1+debug_iphoneos-arm 用法 在macOS上使用Console.app 过滤NetworkSniffer 启动您要捕获的应用程序 输出为+...
  • 岂不是很浪费流量同时也延长了文件下载的时间? 针对这个问题我们可以使用一个文件差分工具 - <a href="https://github.com/Exoway/bsdiff-nodejs">bsdiff-nodejs</a>,该 node 工具调用了 c 语言实现的...

空空如也

空空如也

1 2
收藏数 23
精华内容 9
关键字:

wkwebview下载文件