有个页面是用 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 2023-01-26 15:00:50 +08:00 1
Building42/Telegraph: Secure Web Server for iOS, tvOS and macOS
https://github.com/Building42/Telegraph |
2
lwkiii 2023-01-26 15:48:15 +08:00 via Android
|
3
lwkiii 2023-01-26 15:49:28 +08:00 via Android
原来是 iOS 开发,打扰了......
|
4
Kinnice 2023-01-26 15:51:40 +08:00 via Android
可以把 js 插到单一 html 里面
|
5
qwq11 2023-01-26 15:57:04 +08:00
oh, no 这就是为什么 app 越来越大的原因,微信支付宝 qq 之类的打开全是 lib*.so ,其他 app 不仅全是 libwebview.so ,还有 bundle*.js, chunk*.js ,xxx.html
|
6
xixiya 2023-01-26 16:13:15 +08:00
这玩意不需要维护,APP 嵌入 Http 服务器不是常规需求。
能用就可以了。 |
7
xiangyuecn 2023-01-26 16:15:16 +08:00
“没办法直接用 wkwebview 本地加载”???
一步错,步步错 |
8
xiangyuecn 2023-01-26 16:19:15 +08:00
如果有加载不了的文件,直接用原生代码暴力拦截,直接读本地文件返回响应,什么请求都可以给你搞的服服帖帖
|
9
wingkwanli888 OP @qwq11 没法,h5 页面 UI 太复杂,不可能用原生重写唉
|
10
wingkwanli888 OP @Kinnice 我问了前端的同事,他说测试了几天都构建不了单个 js ,至少两个,一个 app.js (业务代码),另外一个是依赖。我在想可能只能在我这边改
|
11
okakuyang 2023-01-26 16:32:20 +08:00 1
偷懒的话可以用一楼的 Telegraph 这个库,是在 iOS 上运行服务器的,我以前用来做局域网文件传输,还挺好用的。
caddy 就算了,没有意义的折腾。 但是因为本地的话,可能涉及到 https 的问题,需要注意一下,可能会遇到的坑。 |
12
wingkwanli888 OP @xiangyuecn 我知道以前用 UIWebView 是可以这样做的,以为 wkwebview 不行了,我研究看看
|
13
wingkwanli888 OP @okakuyang 感谢,我试试 telegraph
|
14
LifStge 2023-01-26 16:47:29 +08:00
其实没必要大动 本地起服务器的 还是容易出问题的 毕竟逻辑变了 涉及 https 跨域啥的 都要考虑.
毕竟是内置 webview 直接在 js 层面做请求拦截 或者更底层点 webview hook 然后加套缓存层就行了 可以把不经常变动的 影响速度的文件直接打包缓存就行 然后更新了 再动态更新缓存 这样保持正常开发流程不变 只是提速 优化 不过话说回来 如果不是在线的服务 就是单纯用 webview 做 ui 那就另说.. |
15
beilo 2023-01-26 16:49:59 +08:00
回复第 10 楼。
多个 js 也是从 html 上引入的。而你只需要引入单个 html ,根据相对路径就可以自动加载对应的 js 。 为什么会有多个 js 这个问题呢? |
16
okakuyang 2023-01-26 16:54:06 +08:00
@beilo 它是用 webpack 打包的。
应该是 webpack 的代码用 http 请求把 js 下载下来运行的,所以遇到 webview 本地加载这种情况自然就挂壁了。 只要把 webpack 的那部分代码拆解成 html 标准的 js 引入方式就可以用本地顺利加载了。 |
17
z13zvxc 2023-01-26 17:04:11 +08:00 via iPhone 1
@wingkwanli888 你同事菜 怎么可能不能输出到一个 js 自己不愿意研究 we pack 配置而已。
|
18
hzxxx 2023-01-26 21:07:10 +08:00
拦截请求,把请求 web 内容的 http 拦下来解析路径返回自己的不就行了吗
|
19
whileFalse 2023-01-27 02:05:29 +08:00
擦,多大点事。
既然是“某个功能”,就进入 app 的时候自动预加载,等要显示的时候不久秒出了吗。 |
20
systemcall 2023-01-27 10:09:48 +08:00
可以在本地放上预置的开屏广告,网页用上 Service Worker
打开应用就把 WebView 打开,上面再叠上开屏广告 这样子就解决了加载的问题了 |
21
wobuhuicode 2023-01-27 17:43:57 +08:00
其实你只需要把 JS 放在项目里面就可以了。现在的前端基本都是 JS ,让前端把 CSS 也打包进去 JS 就好了。
然后 native 端拦截请求,把 web 页面请求的 JS 都解析到本地的就好了。 |
22
beilo 2023-01-29 12:30:50 +08:00
|
23
gargar 2023-02-10 13:05:14 +08:00
没必要开服务器,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 。 |