有个页面是用 webview 远程加载 h5 展示出来的,客户投诉太慢了,大概要 2s 完成全部加载,我上司說想把 h5 打包成离线包本地加载。
因为 h5 是 webpack 构建,不是单纯一个 html 页面,有好几个 js 文件,没办法直接用 wkwebview 本地加载, 这种情况大概要在 app 里边嵌入一个 web server ,搜了下 github 只有这两个,但好长时间有维护了
https://github.com/swisspol/GCDWebServer https://github.com/robbiehanson/CocoaHTTPServer
Caddy 好像可以用 gomobile 编译,有大哥试过把 caddy 打包在 app 里吗, 或者现在开源社区有没其他方案呢
![]() |
1
justin2018 122 天前 ![]() Building42/Telegraph: Secure Web Server for iOS, tvOS and macOS
https://github.com/Building42/Telegraph |
![]() |
2
lwkiii 122 天前 via Android
|
![]() |
3
lwkiii 122 天前 via Android
原来是 iOS 开发,打扰了......
|
![]() |
4
Kinnice 122 天前 via Android
可以把 js 插到单一 html 里面
|
![]() |
5
qwq11 122 天前
oh, no 这就是为什么 app 越来越大的原因,微信支付宝 qq 之类的打开全是 lib*.so ,其他 app 不仅全是 libwebview.so ,还有 bundle*.js, chunk*.js ,xxx.html
|
6
xixiya 122 天前
这玩意不需要维护,APP 嵌入 Http 服务器不是常规需求。
能用就可以了。 |
![]() |
7
xiangyuecn 122 天前
“没办法直接用 wkwebview 本地加载”???
一步错,步步错 |
![]() |
8
xiangyuecn 122 天前
如果有加载不了的文件,直接用原生代码暴力拦截,直接读本地文件返回响应,什么请求都可以给你搞的服服帖帖
|
9
wingkwanli888 OP @qwq11 没法,h5 页面 UI 太复杂,不可能用原生重写唉
|
10
wingkwanli888 OP @Kinnice 我问了前端的同事,他说测试了几天都构建不了单个 js ,至少两个,一个 app.js (业务代码),另外一个是依赖。我在想可能只能在我这边改
|
11
okakuyang 122 天前 ![]() 偷懒的话可以用一楼的 Telegraph 这个库,是在 iOS 上运行服务器的,我以前用来做局域网文件传输,还挺好用的。
caddy 就算了,没有意义的折腾。 但是因为本地的话,可能涉及到 https 的问题,需要注意一下,可能会遇到的坑。 |
12
wingkwanli888 OP @xiangyuecn 我知道以前用 UIWebView 是可以这样做的,以为 wkwebview 不行了,我研究看看
|
13
wingkwanli888 OP @okakuyang 感谢,我试试 telegraph
|
![]() |
14
LifStge 122 天前
其实没必要大动 本地起服务器的 还是容易出问题的 毕竟逻辑变了 涉及 https 跨域啥的 都要考虑.
毕竟是内置 webview 直接在 js 层面做请求拦截 或者更底层点 webview hook 然后加套缓存层就行了 可以把不经常变动的 影响速度的文件直接打包缓存就行 然后更新了 再动态更新缓存 这样保持正常开发流程不变 只是提速 优化 不过话说回来 如果不是在线的服务 就是单纯用 webview 做 ui 那就另说.. |
15
beilo 122 天前
回复第 10 楼。
多个 js 也是从 html 上引入的。而你只需要引入单个 html ,根据相对路径就可以自动加载对应的 js 。 为什么会有多个 js 这个问题呢? |
16
okakuyang 122 天前
@beilo 它是用 webpack 打包的。
应该是 webpack 的代码用 http 请求把 js 下载下来运行的,所以遇到 webview 本地加载这种情况自然就挂壁了。 只要把 webpack 的那部分代码拆解成 html 标准的 js 引入方式就可以用本地顺利加载了。 |
17
z13zvxc 122 天前 via iPhone ![]() @wingkwanli888 你同事菜 怎么可能不能输出到一个 js 自己不愿意研究 we pack 配置而已。
|
![]() |
18
hzxxx 121 天前
拦截请求,把请求 web 内容的 http 拦下来解析路径返回自己的不就行了吗
|
19
whileFalse 121 天前
擦,多大点事。
既然是“某个功能”,就进入 app 的时候自动预加载,等要显示的时候不久秒出了吗。 |
20
systemcall 121 天前
可以在本地放上预置的开屏广告,网页用上 Service Worker
打开应用就把 WebView 打开,上面再叠上开屏广告 这样子就解决了加载的问题了 |
![]() |
21
wobuhuicode 121 天前
其实你只需要把 JS 放在项目里面就可以了。现在的前端基本都是 JS ,让前端把 CSS 也打包进去 JS 就好了。
然后 native 端拦截请求,把 web 页面请求的 JS 都解析到本地的就好了。 |
22
beilo 119 天前
|
23
gargar 107 天前
没必要开服务器,wkwebview 可以加载本地文件的,单 html 或加上多个 js 、图片都行。
先把东西塞文件夹比如 www ,然后拖进 xcode 你的 project 里,检查 target > build phases > copy bundle resources 确保文件夹也会拷进 bundle 。然后在你的代码里类似这样: NSBundle *mainBundle = [NSBundle mainBundle]; NSURL *fileURL = [NSURL fileURLWithPath:[mainBundle pathForResource:@"index" ofType:@"html" inDirectory:@"www"]]; [_webView loadFileURL:fileURL allowingReadAccessToURL:fileURL]; swift 同理。 我捣腾了两个菜鸡 app 就是用 webview ,其中一个还套上 WebAssembly 。 |